2016-12-14 107 views
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方法可以解决这个问题吗?

+0

你怎么知道这不是'tee'的过程,是放弃了行? –

+0

我想过了,但是我也使用tee :: fgets –

+0

提到了多线程,是否有对日志读取/写入的并发访问?如果不是,请检查如果使用fgetc/fputc读取单个字符会发生什么情况。可能还有一个行结束问题,混合的DOS/UNIX样式行结尾 –

回答

0

正如Remy Lebeau所说,fgetsstd::fgets之间并没有真正的区别,在运行代码std::fgets约20小时后,问题得以再现。

所以我想我需要在其他地方搜索这个问题。

谢谢大家!