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 所建议的那样,fgets
和 std::fgets
之间并没有真正的区别,并且在 运行 与 std::fgets
的代码持续约 20 小时后,问题已转载
所以我想我需要在其他地方搜索问题。
谢谢大家!
我有以下代码:(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 所建议的那样,fgets
和 std::fgets
之间并没有真正的区别,并且在 运行 与 std::fgets
的代码持续约 20 小时后,问题已转载
所以我想我需要在其他地方搜索问题。
谢谢大家!