fopen没有打开文件流...我该如何解决这个问题?

时间:2011-02-16 20:37:34

标签: c fopen

我正在尝试编写一个文件并向其附加数据。

以下是我的代码片段。 thresh是一个未签名的短片。

    FILE *fp_th;
    fp_th = fopen("threshold.txt", "a");
    printf("opening file failed: %s\n", strerror(errno));
fprintf(fp_th,"%d ", thresh);
    fclose(fp_th);

在它工作正常之前,但我已经改变了一些代码,突然间它不再打印出来了。

我已经确认fopen没有用

打开文件流
printf(" check fp_th = %p \n", fp_th);

打印出check fp_th = 00000000

编辑:fopen之后添加了printf("opening file failed: %s\n", strerror(errno));。输出表示没有错误。它撒谎吗?奇..

奇怪的是,我正在编写并附加一个类似的文件,但该文件工作正常。你如何解决返回NULL的fopen?为什么会这样?谢谢!

4 个答案:

答案 0 :(得分:5)

首先

fprintf(fp_th,"%d ", thresh);

在关闭文件或内部FILE *缓冲区已满之前,通常会缓冲输出。您可能无法立即在文件中看到任何输出

您可以fflush()文件*,以便在您决定时将其写入文件。

fprintf(fp_th,"%d ", thresh);
fflush(fp_th);

其次

printf(" check fp_th = %d \n", fp_th);

这不会检查fp_th是否无效。它只是将fp_th的指针值打印为有符号整数,并且-7323824可能与任何值一样好,这将更有意义,如果指针的大小与大小不同,则可能未定义一个int。

要打印指针,您应该使用%p

printf(" check fp_th = %p \n", fp_th);

fopen如果失败则返回NULL,你应该检查是否知道打开文件是否失败。

FILE *fp_th;
fp_th = fopen("threshold.txt", "a");
if(fp_th == NULL) {
   printf("opening file failed: %s\n", strerror(errno));
   return;
}

答案 1 :(得分:3)

首先,始终检查fopen的返回值是否为NULL,这意味着失败。

要查看文件打开期间出了什么问题,您可以使用perror

  if (fp_th == NULL) {
    perror ("Error opening threshold file");
    exit(EXIT_FAILURE);
  }

如果在获得permission deniedNo such file or directory时仍然无法弄清楚,可以使用strace(假设是Linux)并查找相应的系统调用。

答案 2 :(得分:0)

  

在它工作正常之前,但我已经改变了一些代码,突然间它不再打印出来了。

如果您的代码更改了当前工作目录,则可能导致找不到该文件,因为您没有提供完整路径。在这种情况下,fp_th应该是一个空指针,您可以检查它。您的打印建议它不返回空指针,而是打开文件。有关详细信息,请参阅fopen

答案 3 :(得分:0)

我今天遇到了类似的问题。我的代码打开了N-1文件,但在Nth文件中神秘地崩溃了,虽然那个文件肯定存在...

perror透露,我实际上从未关闭所有这些文件 - 我的尴尬,我忘了fclose(fd)......

到目前为止我没有使用perror,但我现在意识到它有多么有价值。 :)