使用fprintf()将奇怪的输出发送到文本文件

时间:2013-06-15 12:59:41

标签: c printf

在模拟程序中,我试图将度量打印到文本文件。该项目是Java,C和C ++的组合,但我正在使用的文件是C.打印代码如下:

if(sample)
  fprintf(MeasureInfo->measuresFile, "%d: %f\n", count++, sample);

这适用于部分输出,但是有大量的数据(大约100到1000个度量)未打印到文本文件中。相反,我只看到Sublime Text中的大量NUL和祝福中的0字节:

436: 0.851661
437: 0.043466
(Really large block of NUL all in one line).210402
751: 0.357543
752: 0.816120

到目前为止,我只使用了部分代码,并认为它可能是一个并发问题。所以我打印出所有使用getpid()访问函数的pid,它给了我不同的(例如19036,19037,19038)。然后我尝试使用pthread_mutex_lock和pthread_mutex_unlock,但它产生了相同的输出。 我尝试的另一件事是每400次测量后使用睡眠。这实际上有助于缩短第四次产生的措施数量。

您是否知道实际问题可能是什么以及如何解决?我真的很抱歉,如果这是一个回答或简单的问题,但我尝试了一段时间,但没有找到解决方案。

2 个答案:

答案 0 :(得分:0)

sample看起来是浮动或双倍。您不应该将浮点变量与固定值进行比较,因为它很可能永远不会具有此值。对于浮点变量,您应始终与delta进行比较。可能始终输入您的if子句。

fprintf不应该打印NUL。你能显示确切的输出(或部分输出)吗?

答案 1 :(得分:0)

I / O和多任务是一种危险的组合。在线程级别,fprintf以线程不安全的方式写入缓冲区。各个格式化组件可能会相互覆盖,当一个调用刷新缓冲区而另一个调用尝试写入时,结果肯定会丢失数据。它甚至可能导致缓冲区溢出并直接崩溃到stdio库。

在进程级别,缓冲区将刷新到文件中的特定位置。如果两个进程同时尝试写入,它们将破坏彼此的结果。一个进程通常不会轮询文件系统以检查文件是否由于外部影响而增长,然后在写入之前寻找新的结束。

如果您有一个非常大的项目并且同步所有I / O都不是一个选项,请考虑分配每个线程或处理自己的文件,并在事后合并文件。