fopen C 上的分段错误
Segmentation fault on 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 函数上,在 fopen 上,如果我用路径替换 "dados1.txt",我将得到错误 "Erro ao abrir o ficheiro" 英文 "Unable to open file" 并且在分段错误之后
我找不到任何错误
您应该从文件名
中去掉结尾的 newline
char *sptr = strchr(path, '\n');
if (sptr) *sptr = '[=10=]';
同时移动 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");
}
}
伙计很好我有这个代码
#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 函数上,在 fopen 上,如果我用路径替换 "dados1.txt",我将得到错误 "Erro ao abrir o ficheiro" 英文 "Unable to open file" 并且在分段错误之后 我找不到任何错误
您应该从文件名
中去掉结尾的newline
char *sptr = strchr(path, '\n');
if (sptr) *sptr = '[=10=]';
同时移动 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");
}
}