【发布时间】:2014-07-31 18:48:42
【问题描述】:
我有一个简单的小程序,可以将一种文件类型转换为另一种文件类型。有很多对 fprintf() 的调用(大致线性地取决于要转换的文件的大小)。当我开始时,没有调用 fflush()。在小文件(40 Kb)当调用 fclose() 时整个事情都崩溃了。
所以,我想也许是我让缓冲区填得太满了,所以我在大约* 512 次 fprintf 调用之后调用了 fflush()(每次调用打印出 8 到 10 个字符)。程序在调用 fclose() 时仍然崩溃。
*因为我实际上没有计算对 fprintf 的调用,而我正在使用程序中已经存在的另一个计数,所以这个数字可能小于 512。
这让我想到了我的问题。什么时候应该调用 fflush()?是否应该在 fprintf'd 一定数量的数据后调用它?还是我缺少什么?
谢谢
顺便说一句,如果相关的话,我使用的是 Windows 7(64 位),并且我已经在“a+”模式下打开了输出文件
【问题讨论】:
-
这实际上可能是未定义行为的情况,因为
fprintf应该在缓冲区已满时自动刷新。 -
fflush 只有在有一些外部实体想要从文件中获取数据时才需要调用。您的程序不需要它。没有必要冲水,不冲水与你的问题无关。
-
奇怪...我唯一的线索是,在大文件上,程序在调用 fclose() 时崩溃了。这可能根本不是缓冲问题。不幸的是,我真的不知道还能是什么
-
valgrind是你的朋友。我不知道 Windows 是否有与strace或truss等效的东西。如果您的代码在每次迭代时都会泄漏内存,那么在处理大文件时它会崩溃并在处理小文件时幸免于泄漏是有道理的。但这只是一个猜测,因为我不知道你的代码中有什么。 -
尝试创建stackoverflow.com/help/mcve,否则问题可能会被推测很久,没有任何有用的结果。