2015-03-05 1 views
0

парень хорошо у меня есть этот кодвина Сегментация на FOPEN C

#include <stdio.h> 

typedef struct 
{ 
    int numero, notaF, notaE; 
    char nome[100]; 
} ALUNO; 

void lerFicheiro(char path[], ALUNO alunos[], int *i); 
void escreverFicheiro(char path[], ALUNO alunos[], int tamanho); 

int main() 
{ 
    //Declarações 
    int i=0,t=0; 
    char path[999], wpath[999]; 
    ALUNO alunos[999]; 
    FILE *f; 

    //Introdução do nome do ficheiro para leitura e para escrita 
    printf("Introduza a localização do ficheiro para leitura: "); 
    fgets(path,999,stdin); //segmentation fault e o fopen dá null (apenas no read) 
    printf("Introduza a localização do ficheiro para escrita: "); 
    fgets(wpath,999,stdin); 

    //Leitura do ficheiro 
     lerFicheiro(path,alunos,&t); 

    //Escrita do ficheiro 
    escreverFicheiro(wpath, alunos, t); 

    return 0; 
} 

void lerFicheiro(char path[], ALUNO alunos[],int *i) 
{ 
    FILE *f = fopen("dados1.txt","r"); 
    if(f!=NULL) 
    { 
     while(fscanf(f,"%d\n",&alunos[*i].numero)==1) 
     { 
      fgets(alunos[*i].nome,100,f); 
      fscanf(f,"%d\n",&alunos[*i].notaF); 
      fscanf(f,"%d\n",&alunos[*i].notaE); 
      *i=*i+1; 
     } 
    } 
    else 
    { 
     printf("Erro ao abrir o ficheiro\n"); 
    } 
    fclose(f); 
} 

void escreverFicheiro(char path[], ALUNO alunos[], int tamanho) 
{ 
    FILE *f = fopen(path,"w+"); 
    int i = 0, notaFinal = 0; 
    for(i=0;i<tamanho;i++) 
    { 
     if(alunos[i].notaF>alunos[i].notaE) 
      notaFinal = alunos[i].notaF; 
     else 
      notaFinal = alunos[i].notaE; 
     if(notaFinal>=10) 
     { 
      fprintf(f,"%d\n",alunos[i].numero); 
      fputs(alunos[i].nome,f); 
      fprintf(f,"%d\n",notaFinal); 
     } 
    } 
    fclose(f); 
} 

Но на функцию lerFicheiro, на Еореп если заменить «dados1.txt» по пути я получаю ошибку «Erro ао abrir о ficheiro»на английском„Невозможно открыть файл“и сразу же после ошибки сегментации я не могу найти ошибку anywere

+1

Вам необходимо удалить хвостовой '\ n' из имени файла, возвращаемого' fgets'. –

+0

Не должно быть 'void lerFicheiro (char * path,' вместо 'void lerFicheiro (char path [],'? – maganap

+0

Переместить 'fclose (f);', вы пытаетесь закрыть файл, который вы не открыли –

ответ

2

Вы должны раздеть заднюю newline от имени файла

char *sptr = strchr(path, '\n'); 
if (sptr) *sptr = '\0'; 

Также перемещайте fclose(f);, вы пытаетесь закрыть файл, который вы не открыли.

void lerFicheiro(char path[], ALUNO alunos[],int *i) 
{ 
    FILE *f = fopen("dados1.txt","r"); 
    if(f!=NULL) 
    { 
     while(fscanf(f,"%d\n",&alunos[*i].numero)==1) 
     { 
      fgets(alunos[*i].nome,100,f); 
      fscanf(f,"%d\n",&alunos[*i].notaF); 
      fscanf(f,"%d\n",&alunos[*i].notaE); 
      *i=*i+1; 
     } 
     fclose(f); 
    } 
    else 
    { 
     printf("Erro ao abrir o ficheiro\n"); 
    } 
}