C++ fgets与std::fgets-fgets遗漏了行

C++ fgets与std::fgets-fgets遗漏了行,c++,multithreading,c++11,std,fgets,C++,Multithreading,C++11,Std,Fgets,我有以下代码:(cpp14) 它应该逐行读取日志文件,然后按原样将其写入另一个日志文件 它是在linux中运行的复杂多线程系统的一部分,并且m_in_log输入是FIFO 当我多次运行此代码时,它会漏掉一些行: 假设m_in_log包含以下行: AAA BBB CCC DDD EEE 但是我只看到了输出日志文件 AAA EEE 意思是fess错过了中间的3行(我知道事实上这些行被发送到FIFO,因为我们也从这个FIFO到另一个文件 TE/,并且在这个文件中所有5行都被写入)。 在与这个问题斗争了

我有以下代码:(cpp14)

它应该逐行读取日志文件,然后按原样将其写入另一个日志文件

它是在linux中运行的复杂多线程系统的一部分,并且
m_in_log
输入是FIFO

当我多次运行此代码时,它会漏掉一些行:

假设
m_in_log
包含以下行:

AAA

BBB

CCC

DDD

EEE

但是我只看到了输出日志文件

AAA

EEE

意思是fess错过了中间的3行(我知道事实上这些行被发送到FIFO,因为我们也从这个FIFO到另一个文件<代码> TE/<代码>,并且在这个文件中所有5行都被写入)。 在与这个问题斗争了一段时间后(没有任何运气),我决定使用
std
方法:

fgets => std::fgets

fputs => std::fputs

fflush => std::fflush
看来问题已经解决了


你能解释一下为什么使用
std
方法可以解决这个问题吗?

正如Remy Lebeau所建议的那样,
fgets
std::fgets
之间并没有什么区别,在使用
std::fgets
运行代码约20小时后,问题再次出现

所以我想我需要在其他地方寻找问题


谢谢大家!

正如Remy Lebeau所建议的那样,
fgets
std::fgets
之间实际上没有区别,在使用
std::fgets
运行代码约20小时后,问题再次出现

所以我想我需要在其他地方寻找问题


谢谢大家!

你怎么知道不是
tee
进程删除了这些行呢?我考虑过,但我也使用了tee和std::fgetsy你提到的多线程,是否存在对日志读/写的并发访问?如果没有,请检查使用fgetc/fputc读取单个字符时会发生什么情况。使用混合DOS/UNIX样式的行,也可能存在行尾问题endings@SvenNilsson系统的这一部分不是多线程的-这个类只有一个所有者,所有的读/写操作都不是并发的。关于单个字符-我在fgets后面的行中添加了printf字符,我没有看到缺少的字符lines@AlexL:您提到的
std
函数只是包装在
std
命名空间中的C函数,仅此而已。它们在功能上与原件相同。如果你真的想在C++中重新编写C代码,你应该使用<代码>:STF:<代码> STD:GETLION()/<代码>输入,和<代码> STD::OFFROWS 输出。你怎么知道不是线下的“代码> TE/<代码”过程?我想了,但是我用TEE也用STD::FGESSY你提到多线程,是否存在对日志读取/写入的并发访问?如果没有,请检查使用fgetc/fputc读取单个字符时会发生什么情况。使用混合DOS/UNIX样式的行,也可能存在行尾问题endings@SvenNilsson系统的这一部分不是多线程的-这个类只有一个所有者,所有的读/写操作都不是并发的。关于单个字符-我在fgets后面的行中添加了printf字符,我没有看到缺少的字符lines@AlexL:您提到的
std
函数只是包装在
std
命名空间中的C函数,仅此而已。它们在功能上与原件相同。如果你真的想在C++中重写C代码,你应该使用<代码> STD::IFSturi用代码> STD:GETLION()/<代码>输入,以及<代码> STD::OFFROWS 输出。
fgets => std::fgets

fputs => std::fputs

fflush => std::fflush