Наиболее эффективный способ чтения строк данных из файла - это обычно чтение большого фрагмента данных, который может занимать несколько строк, обработка строк данных из фрагмента до тех пор, пока один из них не достигнет конца, перемещение любой частичной строки с концабуфера в начало, а затем прочитать другой кусок данных.В зависимости от целевой системы и задачи, которая должна быть выполнена, может быть лучше прочитать достаточно, чтобы заполнить оставшееся пространство после неполной строки, или может быть лучше всегда читать число байтов со степенью двух и сделать буфер большимдостаточно для размещения фрагмента такого размера плюс частичная строка максимальной длины (оставшаяся от предыдущего чтения).Единственная сложность этого подхода заключается в том, что все данные для чтения из потока используют один и тот же буфер.Однако в тех случаях, когда это целесообразно, он часто обеспечивает лучшую производительность, чем использование множества отдельных вызовов на fread
, и может быть лучше, чем использование fgets
.
Хотя это должно быть возможно для стандартныхФункция библиотеки, облегчающая ввод строки, дизайн fgets
довольно ненужно враждебна, поскольку не дает удобного указания на то, сколько данных она прочитала.После прочтения каждой строки код, который хочет получить строку, содержащую печатаемую часть, должен будет использовать strlen
, чтобы попытаться выяснить, сколько данных было прочитано (возможно, входные данные не будут содержать нулевых байтов), а затем проверить байт перед завершающимноль, чтобы увидеть, если это новая строка.Не невозможно, но по крайней мере неловко.Если подход с использованием алгоритма Fread-and-Buffer удовлетворит потребности приложения, он, вероятно, будет по меньшей мере столь же эффективным, как использование fgets
, если не более, и поскольку усилия, необходимые для надежного использования fgets()
, будут сопоставимы с теми, которые требуются дляиспользуйте подход буферизации, также можно использовать последний.