Во-первых, спецификатор преобразования будет %[^\n]
(без s
в конце).
Во-вторых, вы не хотите использовать спецификатор преобразования %[
без явного размера;в противном случае вы рискуете переполнения буфера:
char line[132];
...
fscanf(fp, "%131[^\n]", line);
В-третьих, это оставит символ новой строки во входном потоке, что может привести к засорению следующего чтения.
Наконец, вы не хотите использовать feof
в качестве условия цикла, поскольку оно не вернет true до тех пор, пока после вы не попытаетесь прочитать за пределами EOF, заставляя ваш цикл выполняться слишком много раз.
Честно говоря, я думаю, что лучший вариант - использовать fgets()
;он будет читать все, вплоть до следующего символа новой строки или на единицу меньше указанного размера.IOW, если размер line
вмещает 20 символов, а строка ввода содержит 80 символов (включая символ новой строки), fgets
прочитает 19 символов и добавит терминатор 0 в line
.Если строка ввода содержит 10 символов, она будет считывать всю строку ввода в line
(включая символ новой строки).
fgets
вернет NULL при EOF или ошибке, поэтому вы должны структурировать свой цикл как
while (fgets(line, sizeof line, fp))
{
// do something with line
}
if (feof(fp))
// hit end of file
else
// error on read.