使用多个fprintf调用时,何时应该使用fflush?

3
我有一个简单的小程序,可以将一种文件类型转换为另一种。在该程序中有相当多的fprintf()调用(与要转换的文件大小大致成正比)。开始时,没有任何对fflush()的调用。在处理较小文件(<10KB)时,完全没有问题。在较大文件(>40KB)上,当调用fclose()时整个程序崩溃了。
因此,我认为可能是缓冲区填满或其他原因导致的,所以我在大约512次fprintf调用后(每次调用打印8到10个字符),加入了fflush()的调用。但程序仍然在调用fclose()时崩溃。
这就带来了我的问题。应该在什么时候调用fflush()?应该在fprintf输出一定量的数据之后调用吗?还是我漏掉了些什么?
谢谢
顺便说一下,如果有关系的话,我的操作系统是Windows 7(64位),并且我以“a +”模式fopen了输出文件。

这实际上可能是未定义行为的情况,因为 fprintf 在缓冲区满时应该自动刷新。 - Drew McGowen
2
只有在某些外部实体需要从文件中获取数据时,才需要调用fflush。对于您的程序,您不需要它。没有必要刷新,缺少刷新与您的问题无关。 - tdelaney
valgrind是您的好朋友。我不知道Windows是否有类似于stracetruss的工具。如果您的代码在每次迭代中存在内存泄漏,那么当处理大文件时它崩溃是有道理的,而在处理小文件时则可以幸免于此。但这只是我的猜测,因为我不知道您的代码里面有什么问题。 - alvits
1
尝试创建http://stackoverflow.com/help/mcve,否则问题可能会被长时间猜测而没有任何有用的结果。 - Eugene Podskal
我已经将问题缩小到realloc调用和错误的堆指针。如果我真的无法自己解决它,我可能会将其制作成一个新问题。然而,由于这个问题涉及fflush()和fprintf(),所以我应该保留它还是删除它,因为它与帖子中描述的问题无关? - Marco Merlini
显示剩余2条评论
1个回答

6

完全可以根据需要多次调用fprintf,而不需要一次调用fflush。程序崩溃是由于程序中其他原因引起的,很可能是一些无效的内存访问,添加fflush调用并不能解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接