inizialization后文件指针仍为NULL?

时间:2016-06-24 14:11:48

标签: c fopen

大家好我在尝试打开文件时遇到问题。在我尝试读取现有文本文件的函数中,在初始化文件指针后,我仍然收到错误“无法打开文件”,这是代码:

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个。

1 个答案:

答案 0 :(得分:2)

您的代码应该有效,我只能想到可能导致此问题的3件事。 根据我的经验,通常情况下,简单的错误会让你感到困惑,因为你会专注于更复杂的元素,而某些事情会让你失去理智。我无法看到你的其他节目,所以请原谅我,如果这些答案中的任何一个看起来很光顾。以下是我要检查的第一件事:

1。)文件权限。确保您是有权访问和/或更改相关文件的用户。这是一个很容易修复的Linux,但我不知道windows。

2。)文件位置。确保您的文本文件与可执行文件位于同一目录中。如果您没有指定文件位置,则需要执行此操作。

3。)#include语句。有时甚至我们中最好的人都太兴奋了,无法进入我们的大部分程序,我们忘记包含stdio.h和/或stdlib.h。如果是这种情况,您可能会遇到将文件指针设置为null,然后fopen函数不运行的问题,因此您的指针保持为空。