1
错过我有以下代码:(cpp14)与fgets与标准::与fgets - 线由与fgets
static int const max_len = 1000;
FILE* m_in_log = NULL;
FILE* m_log = NULL;
...
...
bool readLine(char* line, int max_len)
if(!fgets(line, max_len, m_in_log)) {
return false;
}
fputs(line, m_log);
fflush(m_log);
return true;
}
它应该从日志文件中读取一行行,然后写它,是,到另一个日志文件中。
它是在linux中运行的复杂多线程系统的一部分,而m_in_log
输入是FIFO。
当我多次运行这段代码,东西它错过行:
假设m_in_log
包含以下行:
AAA
BBB
CCC
DDD
EEE
但输出日志文件我只看到
AAA
EEE
意味着与fgets漏读3行中间(我知道这些行被发送到FIFO的事实,因为我们也从这个FIFO到另一个文件做了tee
,并且在这个文件中所有5行s写入)。
这个问题挣扎了一段时间(没有任何运气)后,我决定使用std
方法:
fgets => std::fgets
fputs => std::fputs
fflush => std::fflush
而且好像是解决了问题。
请问您能解释为什么用std
方法可以解决这个问题吗?
你怎么知道这不是'tee'的过程,是放弃了行? –
我想过了,但是我也使用tee :: fgets –
提到了多线程,是否有对日志读取/写入的并发访问?如果不是,请检查如果使用fgetc/fputc读取单个字符会发生什么情况。可能还有一个行结束问题,混合的DOS/UNIX样式行结尾 –