Может fscanf () пробел чтения?

Я уже заставил некоторый код читать использование текстового файла fscanf(), и теперь мне нужен в измененный так, чтобы поля, которые были ранее потребностью без пробелов позволить пробел. Текстовый файл в основном в форме:

заголовок: ДАННЫЕ
заголовок: ДАННЫЕ
и т.д...

который в основном анализируется с помощью fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);, чтение Полей данных и игнорирование заголовков, но теперь некоторые поля данных должны позволить пробелы. Я все еще должен сразу проигнорировать заголовок и пробел после него, но затем читать в остальной части строки включая пробел.

Должен там так или иначе сделать это с sscanf() функция?

В противном случае, каково самое маленькое изменение, которое я могу внести в код для обработки пробела правильно?

ОБНОВЛЕНИЕ: Я отредактировал вопрос заменить fscanf () с fgets () + sscanf (), который является тем, что на самом деле использует мой код. Я действительно не думал, что было необходимо, когда я сначала записал вопрос, который является, почему я упростил его до fscanf ().

6
задан Graphics Noob 23 December 2009 в 00:37
поделиться

6 ответов

Если вы не можете использовать fgets(), используйте %[ спецификатор преобразования (с "опцией исключения"):

char buf[100];
fscanf(stdin, "%*s %99[^\n]", buf);
printf("value read: [%s]\n", buf);

Но fgets() намного лучше.


Правка: версия с fgets() + sscanf()

char buf[100], title[100];
fgets(buf, sizeof buf, stdin); /* expect string like "title: TITLE WITH SPACES" */
sscanf(buf, "%*s %99[^\n]", title);
13
ответ дан 8 December 2019 в 04:29
поделиться

Если вы настаиваете на использовании scanf, и предполагаете, что вы хотите использовать новую строку в качестве терминатора, вы можете сделать это:

scanf("%*s %[^\n]", str);

Обратите внимание, однако, что вышеизложенное, используемое в точности как написано, является плохой идеей, потому что нет ничего, что могло бы защититься от переполнения str (так как scanf не знает его размера). Конечно, можно задать предопределенный максимальный размер и указать его, но тогда Ваша программа может работать некорректно на некотором корректном входе.

Если размер строки, заданный форматом ввода, не ограничен, то Вашим единственным практическим вариантом будет использование fgetc для чтения данных char на char, периодически переопределяя буфер по ходу работы. Если вы это сделаете, то модифицируете его таким образом, чтобы все читаемые символы char переставали считываться до тех пор, пока первый пробельный символ не станет достаточно тривиальным.

.
3
ответ дан 8 December 2019 в 04:29
поделиться

Я настоятельно рекомендую Вам прекратить использование fscanf() и начать использовать fgets() (который читает целую строку), а затем разобрать прочитанную строку. Это позволит вам значительно больше свободы в отношении неточно отформатированных входных данных.

.
3
ответ дан 8 December 2019 в 04:29
поделиться

Самое простое - это выпустить

fscanf("%*s");

, чтобы отбросить первую часть, а затем просто позвонить в fgets:

fgets(str, stringSize, filePtr);
3
ответ дан 8 December 2019 в 04:29
поделиться

Спецификатор %s в fscanf пропускает любые пробелы на входе, затем считывает строку не пробельных символов до следующего пробела и не включает его.

Если вы хотите прочитать до новой строки, вы можете использовать %[^\n] в качестве спецификатора. Кроме того, символ ' ' в строке форматирования будет пропускать пробелы на входе. Таким образом, если вы используете

fscanf("%*s %[^\n]", &str);

она прочитает первую вещь в строке до первого пробела ("title:" в вашем случае), и выбросит ее, затем прочитает символы пробела и выбросит их, затем прочитает все символы до новой строки в строку, которая звучит так, как вы хотите.

Будьте осторожны, чтобы строка не переполнилась - вы можете использовать

fscanf("%*s %100[^\n]", &str)

для ограничения максимальной длины строки, которую вы будете читать (100 символов, не считая окончания NUL здесь).

.
2
ответ дан 8 December 2019 в 04:29
поделиться

Вы бежите против того, для чего подходит семейство *scanf. С довольно минимальными изменениями вы можете попробовать использовать модули сканирования строк из интерфейсов и имплементаций C Дэйва Хэнсона . Этот материал является ретрофитом языка программирования Icon, чрезвычайно простого и мощного языка обработки строк, над которым Хэнсон и другие специалисты работали в Аризоне. Отход от sscanf не будет слишком жестким, и с ним проще, легче работать, и он более мощный, чем регулярные выражения. Единственный минус в том, что код немного сложноват без книги - но если вы много программируете на Си, то книга того стоит.

.
1
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: