gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:33 25 4
gpt4 key购买 nike

在模拟程序中,我试图将测量值打印到文本文件中。该项目是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com