Ответ 1
Обычно вы читаете файлы на 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
для правильного функционирования кода.