Как читать пустые строки, используя% [^ \ n] s? - PullRequest
0 голосов
/ 13 октября 2011

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

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

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

Если я вставлю цикл while,

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

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

строку как NULL.(line = "")

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

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

Во-первых, спецификатор преобразования будет %[^\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.
1 голос
/ 13 октября 2011

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

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

...