我正在尝试编写一个文件并向其附加数据。
以下是我的代码片段。 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?为什么会这样?谢谢!
答案 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 denied
或No such file or directory
时仍然无法弄清楚,可以使用strace
(假设是Linux)并查找相应的系统调用。
答案 2 :(得分:0)
在它工作正常之前,但我已经改变了一些代码,突然间它不再打印出来了。
如果您的代码更改了当前工作目录,则可能导致找不到该文件,因为您没有提供完整路径。在这种情况下,fp_th
应该是一个空指针,您可以检查它。您的打印建议它不返回空指针,而是打开文件。有关详细信息,请参阅fopen。
答案 3 :(得分:0)
我今天遇到了类似的问题。我的代码打开了N-1文件,但在Nth文件中神秘地崩溃了,虽然那个文件肯定存在...
perror透露,我实际上从未关闭所有这些文件 - 我的尴尬,我忘了fclose(fd)......到目前为止我没有使用perror,但我现在意识到它有多么有价值。 :)