Как узнать символ новой строки в fscanf? - PullRequest
1 голос
/ 04 августа 2009

Как узнать, что fscanf достиг новой строки \ n в файле. Я использовал свои собственные функции для этого. Я знаю, что могу использовать fgets, а затем sscanf для моего требуемого шаблона. Но мои требования нестабильны, иногда я хочу получить разделенные табуляцией строки, иногда новые строки, разделенные специальными символами. Так что, если есть какой-либо способ узнать о новой линии от fscanf, пожалуйста, помогите мне. Или любые альтернативные способы также приветствуются.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 04 августа 2009
fscanf(stream, "%42[^\n]", buffer);

является эквивалентом fgets (buffer, 42, stream). Вы не можете заменить 42 на *, чтобы указать длину буфера в аргументе (как вы можете сделать в printf), его значение состоит в том, чтобы подавить присваивание. Так

fscanf(stream, "%*[^\n]%*c");

читать до (и включается) следующий символ конца строки.

Любой спецификатор преобразования, кроме [, c и n, начинается с пропуска пробелов.

1 голос
/ 05 августа 2009

Керниган и Пайк в превосходной книге ' Практика программирования ' показывают, как использовать sprintf() для создания соответствующего спецификатора формата, включая длину (аналогично примерам в ответе AProgrammer), и затем используйте это в вызове на scanf(). Таким образом, вы также можете управлять разделителями. Опасения по поводу «неэффективности» этого подхода, вероятно, ошибочны - альтернативы сложнее понять.

Тем не менее, я обычно не использую семейство функций scanf() для файлового ввода / вывода; Я получаю данные в строку с помощью некоторой подпрограммы 'get line', а затем использую семейство функций sscanf(), чтобы разделить их - или другой более специализированный код синтаксического анализа.

...