На самом деле это зависит от того, как вы хотите обрабатывать слишком длинные строки.
fgets
с буфером приличного размера будет работать в целом, и вы можете обнаружить, что он "потерпел неудачу" - конец буфера не имеет символа новой строки. Можно всегда избегать использования strlen () для подтверждения переполнения буфера, но это другой вопрос.
Возможно, ваша стратегия состоит в том, чтобы просто пропустить строки, которые не могут быть обработаны, или, возможно, остальная часть строки - это просто комментарий, который вы в любом случае проигнорируете, и в этом случае легко поместить fgets
в цикл отказаться от остальной части строки без штрафов за распределение.
Если вы хотите прочитать всю строку независимо от того, тогда getline
может быть лучшей стратегией для вас. Злоумышленнику потребуется много места на диске, чтобы вызвать плохое поведение, которое вы описываете, или, возможно, передать / dev / random или аналогично имени входного файла.
Опять же, если getline
не может перераспределить, он потерпит неудачу таким образом, что вы сможете восстановить, хотя, если вы повторно используете буфер для многострочного чтения, вы можете захотеть освободить буфер, который он имеет после ошибка перед попыткой прочитать больше, так как она все еще выделена и, возможно, выросла настолько, насколько могла, до сбоя.