Как читать пустые строки, используя %[^ n] s?

#c #scanf

#c #scanf

Вопрос:

У меня есть программа, в которой

 fscanf(fp,"%[^n]s",line);
  

используется для чтения строки.

Если я введу цикл while,

 while(!feof(fp))
    fscanf(fp,"%[^n]s",line);
  

приведенный выше код работает для первой строки, а для остальных я получаю

строка как НУЛЕВАЯ. ( строка = «» )

Мой файл содержит много строк, даже много пустых строк. Как я могу заставить приведенный выше код работать?

Комментарии:

1. Прочитайте часто задаваемые вопросы по comp.lang.c ; начните с пункта 12.2.

Ответ №1:

Во-первых, спецификатор преобразования будет %[^n] (no s в конце).

Во-вторых, вы не хотите использовать спецификатор %[ преобразования без явного размера; в противном случае вы рискуете переполнением буфера:

 char line[132];
...
fscanf(fp, "1[^n]", line);
  

В-третьих, это оставит новую строку во входном потоке, что может привести к засорению следующего чтения.

Наконец, вы не хотите использовать feof в качестве условия цикла, поскольку оно не вернет true до тех пор, пока вы не попытаетесь прочитать EOF, в результате чего ваш цикл выполняется слишком много раз.

Честно говоря, я думаю, что лучшим вариантом является использование fgets() ; он будет читать все, вплоть до следующей новой строки или на единицу меньше указанного размера. IOW, если line его размер рассчитан на 20 символов, а входная строка содержит 80 символов (включая новую строку), fgets будет считано 19 символов и добавлено значение 0 line . Если входная строка состоит из 10 символов, она будет считывать всю входную строку line (включая новую строку).

fgets вернет NULL при EOF или error, поэтому вы должны структурировать свой цикл следующим образом

 while (fgets(line, sizeof line, fp))
{
  // do something with line
}
if (feof(fp))
  // hit end of file
else
  // error on read.
  

Комментарии:

1. @Joth Bode Спасибо за ваш откровенный ответ:-) Наконец-то я использовал fgets. Я подумал о том, как сделать это с помощью printf. (поскольку я очень люблю использовать printf). Есть ли какой-нибудь способ добиться этого с помощью printf. Ответ будет действительно оценен!

Ответ №2:

Я почти уверен, что n не допускается в наборе сканирования. Было бы полезно, если бы вы указали, что вы пытаетесь там закодировать.

Если вы хотите читать целые строки, я бы настоятельно рекомендовал вам использовать библиотечную процедуру fgets(). С помощью fgets() вы можете указать, сколько символов нужно прочитать максимум, чтобы избежать переполнения буфера.

Комментарии:

1. 'n' разрешено в наборе сканирования, как в fscanf(stdin,"%*[^n]"); (взято из спецификации C.) True fgets() лучше, чем код OP.