fscanf () для ввода - PullRequest
       7

fscanf () для ввода

0 голосов
/ 10 сентября 2011

Вот мой код:

FILE* fp,*check;
fp=fopen("file.txt","r");
check=fp;
char polyStr[10];
while(fgetc(check)!='\n')
{
    fscanf(fp,"%s",polyStr);
    puts(polyStr);
    check=fp;
}
while(fgetc(check)!=EOF)
{
    fscanf(fp,"%s",polyStr);
    puts(polyStr);
    check=fp;
}

Теперь, если мой file.txt:

3,3, 4,4, 5,5
4,1, 5,5, 12,2

Теперь вывод:

,3,
4,4,
5,5,
,1,
5,5,
12,2,

Теперь, почемупервый символ обеих строк не читается?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Ваш fgetc вызов съедает персонажа.

Вы должны прочитать целые строки с fgets, а затем проанализировать их с семейством strtol. Вы никогда не должны использовать какие-либо функции *scanf.

0 голосов
/ 10 сентября 2011

Давайте сначала поговорим о формате входных данных. Ваш список будет лучше отформатирован, если у вас будет только <coef>,<exp> без запятой. Таким образом, у вас будет хороший шаблон для сопоставления. Таким образом, вы можете сделать что-то вроде:

fscanf(filep, "%d,%d", &coef, &exp)

чтобы получить значения. Вам следует проверить возвращаемое значение из fscanf, чтобы убедиться, что вы читаете 2 поля. Таким образом, если формат строки был набором следующего '<coef>,<exp><white-space>' (где пробел - это либо один пробел, либо одна новая строка, вы могли бы сделать следующее:

do {
    fscanf(filep, "%d,%d", &coef, &exp);
} while (fgetc(filep) != '\n');

Этот код позволяет вам получать пары до конца строки. В то время как условный будет съедать либо пробел, либо перевод строки. Вы можете заключить это в другой цикл для обработки нескольких строк.

Обратите внимание, что я НЕ проверял этот код, но суть его должна быть ясна. Прокомментируйте, если у вас есть еще вопросы.

...