c - 使用 fprintf() 将奇怪的输出到文本文件

标签 c printf

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

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

这适用于部分输出,但有大量数据(大约 100 到 1000 个度量)未打印到文本文件中。相反,我在 Sublime Text 中看到了大量的 NUL,在 bless 中看到了 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,它给了我不同的 pid(例如 19036、19037、19038)。然后我尝试使用 pthread_mutex_lock 和 pthread_mutex_unlock 但它产生了相同的输出。 我尝试的另一件事是在每 400 次测量后使用 sleep 。这实际上有所帮助,但将产生的小节数量缩短了四分之一。

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

最佳答案

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

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

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

关于c - 使用 fprintf() 将奇怪的输出到文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123911/

相关文章:

c# - 在 Windows Server 2012 上将字符串从 C DLL 返回到 C# DLL 时出现 HTTP 状态 502 错误

java - Java中的输出文本移动了半个空格

c++ - fwprintf 正在打印垃圾

c++ - C/C99/C++/C++x/GNU C/GNU C99 中枚举的签名

c - 生产者消费者线程和互斥体

c - 用 C 读取客户端的所有行

c - 除了 for 循环之外,还有其他方法可以检查凯撒密码中是否为整数吗? CS50 pset2 凯撒密码

bash - 使用 printf 时行未正确对齐

c - 数组输出杂项

c - 为什么大于 x7F 的十六进制编码字符在 printf 函数中显示不同?