fgets与std :: fgets - fgets错过了行数

时间:2016-12-14 14:53:32

标签: c++ multithreading c++11 std fgets

我有以下代码:(cpp14)

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行写的。)

在这个问题上挣扎一段时间后(没有任何运气)我决定使用std方法:

fgets => std::fgets

fputs => std::fputs

fflush => std::fflush

似乎问题已经解决了。

您能否解释为什么使用std方法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

正如Remy Lebeau所说,fgetsstd::fgets之间并没有什么区别,并且在使用std::fgets运行代码约20个小时之后,该问题又被重现了。

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

谢谢大家!