fgets vs. std::fgets - 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
ВВВ
CCC
DDD
EEE
но выходной файл журнала я вижу только
AAA
EEE
то есть fgets пропустил чтение 3 строк в середине (я точно знаю, что эти строки были отправлены в FIFO, потому что мы также делаем tee
из этого FIFO в другой файл, и в этом файле записаны все 5 строк).
Поработав с этим вопросом в течение некоторого времени (без какой-либо удачи), я решил использовать std
методы:
fgets => std::fgets
fputs => std::fputs
fflush => std::fflush
и кажется, что проблемы решены.
Не могли бы вы объяснить, почему с помощью std
методы могут решить эту проблему?
1 ответ
Как предположил Реми Лебо, на самом деле нет разницы между fgets
а также std::fgets
и после запуска кода с std::fgets
в течение ~20 часов проблема воспроизводилась.
Поэтому я думаю, что мне нужно искать проблему в другом месте.
Спасибо вам всем!