Обычно вы читаете файлы на C, используя fgets
. Вы также можете использовать scanf("%[^\n]")
, но довольно много людей, читающих код, могут найти это запутанным и чуждым.
Редактировать: с другой стороны, если вы действительно хотите просто посчитать строки, слегка модифицированная версия подхода scanf
может работать довольно хорошо:
while (EOF != (scanf("%*[^\n]"), scanf("%*c")))
++lines;
Преимущество этого в том, что с * в каждом преобразовании scanf
читает и сопоставляет входные данные, но ничего не делает с результатом. Это означает, что нам не нужно тратить память на большой буфер, чтобы хранить содержимое строки, которая нас не волнует (и все равно есть шанс получить строку, которая даже больше этой, поэтому наш счетчик в итоге окажется неправильным если только мы не сможем даже больше работать, чтобы выяснить, закончился ли ввод, который мы читаем, новой строкой).
К сожалению, нам нужно разбить scanf
на две части, подобные этой. scanf
останавливает сканирование при сбое преобразования, и если вход содержит пустую строку (две последовательные строки), мы ожидаем, что первое преобразование завершится неудачно. Однако даже если это не удастся, мы хотим, чтобы произошло второе преобразование, чтобы прочитать следующую новую строку и перейти к следующей строке. Поэтому мы пытаемся сначала преобразовать, чтобы «съесть» содержимое строки, а затем выполнить преобразование %c
, чтобы прочитать символ новой строки (часть, которая нас действительно волнует). Мы продолжаем делать оба, пока второй вызов scanf
не вернет EOF
(что обычно будет в конце файла, хотя это может также произойти в случае чего-то вроде ошибки чтения).
Edit2: Конечно, есть еще одна возможность, которая (по крайней мере, возможно) проще и проще для понимания:
int ch;
while (EOF != (ch=getchar()))
if (ch=='\n')
++lines;
Единственная часть этого, которую некоторые люди находят нелогичным, состоит в том, что ch
должен быть определен как int
, а не char
для правильной работы кода.