【发布时间】:2020-07-02 17:24:36
【问题描述】:
我在尝试将数据写入C.<br/> 中的文件时得到一些奇怪的结果
我认为fclose() 将*FILE 和flushes 的数据从其缓冲区关闭到file.<br/>
但由于某种原因,它有时只刷新我程序中的数据,而其他时候则不这样做。
例如:我会运行这段代码,在我的文件中我可以看到这两个字符串。 (完美,正是我想要的)
但是当我接下来运行代码 4 次时,它并没有改变我文件中的任何内容。然后当我再次运行它时,突然出现了 10 个额外的字符串(我上次运行程序时有 8 个,现在有 2 个)
(这4次只是一个例子,有时是5、8、10,甚至只是2次才看到输出出现)
我真的不明白这个? 每次运行程序后数据不应该可见吗? 在我运行程序的不同时间之间,这个缓冲区甚至保存在哪里,因为程序每次都完成,所以内存被释放,对吧?
(顺便说一句,我在 fclose() 之前和之后也尝试过fflush(fd),但这并没有解决问题)
#include <stdio.h>
int main(int argc, char const *argv[]) {
FILE * fd;
fd = fopen("test_file.txt", "a");
fprintf(fd, "String 1\n");
fprintf(fd, "String 2\n");
fclose(fd);
return 0;
}
【问题讨论】:
-
如何查看生成的文件?您使用什么操作系统?什么文件系统?
-
也许您打开用于查看文件内容的文本编辑器,而 那个 没有得到更新。您可能需要重新加载文件,并且某些编辑器会警告您文件内容已更改。
-
测试返回值:
if (fclose(fd)) perror("fclose");。当没有错误时,fclose()包含等效于fflush():请参阅 C11 7.21.5.1。 -
在这种情况下,理想情况下,您应该检查所有四个 i/o 语句的结果,以验证它们是否应该成功。
-
@WeatherVane 指出的关于检查 I/O 语句的返回值的内容至关重要。在发布的代码中,您无法知道 ANY 的调用是否有效。另请注意,
fprintf()语句中的数据在调用fclose()之前实际上可能不会写入文件,并且在您的所有其他调用似乎都成功之后,fclose()可能会失败,因为数据被缓冲,直到fclose()刷新它才真正写入。如果您的磁盘已满或发生其他问题,则所有之前的“成功”fwrite()调用都将被清除。