Заставить fscanf игнорировать необязательный параметр - PullRequest
2 голосов
/ 29 октября 2008

Я использую fscanf для чтения файла со строками типа
Число <-белое пространство-> строка <-белое пространство-> необязательный_3-й столбец

Я хочу извлечь номер и строку из каждого столбца, но игнорирую 3-й столбец, если он существует

Пример данных:
12 фу что-то
03 бар
24 что-то # randomcomment

Я бы хотел извлечь 12, foo; 03, бар; 24 что-то, игнорируя "что-то" и "#randomcomment"

У меня сейчас есть что-то вроде

while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

Однако это не работает со строками без 3-го столбца. Как я могу заставить его игнорировать все после 2-й строки?

Ответы [ 4 ]

10 голосов
/ 29 октября 2008

Проблема в том, что %*s съедает число на следующей строке, когда нет третьего столбца, а затем следующий %d терпит неудачу, потому что следующий токен не является числом. Чтобы исправить это без использования gets(), за которым следует sscanf(), вы можете использовать указанный класс символов:

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

[^\n] говорит, что должно соответствовать как можно большему числу символов, которые не являются символами новой строки, а * подавляет назначение, как и раньше. Также обратите внимание, что вы не можете поместить пробел между %s и %*[\n], потому что в противном случае этот пробел в строке формата будет совпадать с новой строкой, в результате чего %*[\n] будет соответствовать всей последующей строке, а это не то, что ты хочешь.

4 голосов
/ 29 октября 2008

Мне кажется, что самое простое решение - это scanf ("% d% s", & num, & word) и затем fgets (), чтобы съесть оставшуюся часть строки.

4 голосов
/ 29 октября 2008

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

0 голосов
/ 29 октября 2008

Я часто использую get (), за которым следует sscanf () для строки, которую вы просто ... ну, gots.

Бонус: вы можете отделить тест для конца ввода от анализа.

...