大家好我在尝试打开文件时遇到问题。在我尝试读取现有文本文件的函数中,在初始化文件指针后,我仍然收到错误“无法打开文件”,这是代码:
FILE * fp;
fp = NULL;
fp=fopen("results.txt","r");
if(fp==NULL){
printf("error!");
exit(1);
}
使用调试器我可以看到fp根据请求初始化为NULL。在下一个顺序中,我可以看到它的值更改为“0x751d9c68”。 所以现在它不是NULL,但程序仍然会输出错误。
PS:我使用相同的代码在另一个程序中打开另一个文件(有效):因为fp的初始值是NULL,然后它被改为'0x751d9c68'(是的,它在两个程序中具有相同的值) ),但这次有效,因为fp实际上与NULL不同。
PPS:如果有帮助,我正在使用Codelite。
编辑:添加printf(“%p \ n”,fp);打印此“751D9C68”
Atleta * leggiRisultati (char fileName [], int * dim){FILE * fp; int count, i;
Atleta temp;
fp = NULL;
fp=fopen(fileName,"r");
printf("%p\n", fp);
if(fp==NULL){
perror("Error");
}
while (fscanf (fp, "%s%s%d%d%d", temp.cod, temp.nome, &temp.tN, &temp.tB, &temp.tC)== 5)
count ++;
rewind (fp);
Atleta * atl = (Atleta*) malloc(count * sizeof(Atleta));
for (i=0; i<count; i++){
int nr = fscanf(fp, "%s%s%d%d%d",atl[i].cod, atl[i].nome, &atl[i].tN, &atl[i].tB, &atl[i].tC);
//just controlling if the reading is done properly
if (nr < 4) {
printf ("cannot read the file %s",fileName);
exit (1);
}
} fclose(fp);
return atl;
}
然后我在这个主要的
中使用这个功能 int main (){ int dim; Atleta * a; int i;
a = leggiRisultati("risultati.txt", &dim);
for (i =0; i<dim;i++){
stampaRisultato(a[i]);}
return 0;
}
其中“stampaRisultato”打印刚读取的文件的一行,“Atleta”是一个定义为的结构:
typedef struct {
char cod[5];
char nome[21];
int tN, tB, tC;
}Atleta;
最后,是的,文本文件与我的可执行文件位于同一目录中,是的,我有权打开文件,该文件包含一定数量的行,每行包含2个字符串和3个。
答案 0 :(得分:2)
您的代码应该有效,我只能想到可能导致此问题的3件事。 根据我的经验,通常情况下,简单的错误会让你感到困惑,因为你会专注于更复杂的元素,而某些事情会让你失去理智。我无法看到你的其他节目,所以请原谅我,如果这些答案中的任何一个看起来很光顾。以下是我要检查的第一件事:
1。)文件权限。确保您是有权访问和/或更改相关文件的用户。这是一个很容易修复的Linux,但我不知道windows。
2。)文件位置。确保您的文本文件与可执行文件位于同一目录中。如果您没有指定文件位置,则需要执行此操作。
3。)#include语句。有时甚至我们中最好的人都太兴奋了,无法进入我们的大部分程序,我们忘记包含stdio.h和/或stdlib.h。如果是这种情况,您可能会遇到将文件指针设置为null,然后fopen函数不运行的问题,因此您的指针保持为空。