fgets vs. std :: fgets- fgets错过了线条

fgets vs. std::fgets - lines are missed by fgets

本文关键字:fgets 错过了 fgets- vs std      更新时间:2023-10-16

我有以下代码:(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的事实,因为我们也将tee从此FIFO进行了,并且在此文件中,所有5行都写了))。

在解决这个问题一段时间后(没有运气),我决定使用std方法:

fgets => std::fgets
fputs => std::fputs
fflush => std::fflush

似乎解决了问题。

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

正如雷米·勒博(Remy Lebeau)所建议的那样, fgetsstd::fgets之间并没有差异,并且在用 std::fgets运行代码〜20小时后,该问题被复制了。

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

谢谢大家!