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

fgets vs. std::fgets - lines are missed by 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 方法可以解决这个问题?

正如 Remy Lebeau 所建议的那样,fgetsstd::fgets 之间并没有真正的区别,并且在 运行 与 std::fgets 的代码持续约 20 小时后,问题已转载

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

谢谢大家!