использование fscanf в C - PullRequest
       2

использование fscanf в C

0 голосов
/ 09 марта 2012

У меня есть такой файл:

10 15
something

Я хочу прочитать это в виде переменных дерева, скажем, number1, number2 и mystring.У меня есть сомнения по поводу того, какой шаблон дать fscanf.Я думаю, что-то вроде этого;

fscanf(fp,"%i %i\n%s",number1,number2,mystring);

Должно ли это работать, а также, это правильный способ чтения этого файла?Если нет, что бы вы предложили?

Ответы [ 3 ]

2 голосов
/ 09 марта 2012
fscanf(fp,"%i %i\n%s",&number1,&number2,mystring);

fscanf принимает указатели.

1 голос
/ 09 марта 2012

Прочитайте каждую строку с помощью fgets (или getline, если она у вас есть), разделите строку на strsep (лучше, если доступно) или strtok_r (более неудобный API, но более переносимый), а затем используйте strtoul для преобразования строк в числа при необходимости.

*scanf никогда не должен использоваться, потому что:

  1. Некоторые строки формата (например, голые "%s") так же стремятся переполнить ваши буферы, как и gets.
  2. Поведение при целочисленном переполнении равно undefined - неверный ввод может привести к сбою вашей программы.
  3. Они не сообщают о позиции символа первой ошибки сканирования, что делает почти невозможным восстановление после ошибки синтаксического анализа. (Это можно несколько смягчить, используя fgets и затем sscanf вместо fscanf.)
0 голосов
/ 09 марта 2012

Помимо проблемы с указателями, обычно использование пробелов в формате scanf является ошибкой - в большинстве случаев scanf автоматически пропускает пробелы.Поэтому я бы использовал что-то вроде:

int number1, number2;
char mystring[32];
fscanf("%i%i%31s", &number1, &number2, &mystring)

Это будет читать два числа, за которыми следует строка до 31 непробельного символа, все разделенные пробелом.Обратите внимание, что «пробел» включает в себя пробелы, символы табуляции и новые строки, поэтому не имеет значения, все ли это на одной строке или разбросано на 3 строки или что-либо между ними.

Обратите внимание также на использование ограничения наразмер строки - без этого вход может переполнить любой предоставленный вами буфер фиксированного размера (и нет способа предоставить буфер переменного размера с помощью scanf)

...