Fscanf в C для хранения данных из файла - PullRequest
1 голос
/ 26 сентября 2011

Вот мой код.

#include<stdio.h>

struct element {
    int value;
    char activity;
};

typedef struct element element;

int main(int argc,char** argv) {
    FILE* fp;
    fp = fopen(argv[1], "r");

    element a;

    while(feof(fp) == 0) {
        fscanf(fp, "%c %d", &a.activity, &a.value);

        printf("\n%d", a.value);
    }
}

теперь он выводит мне каждое целое число в файле два раза ..

Почему я получаю этот странный ответ?

Моя структура:

struct element {
    int value;
    char activity;
};

typedef struct element element;

и мой входной файл:

i 23
i 56
i 19
i 20
i 44

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Посмотрите на ваш fscanf шаблон:

fscanf(fp, "%c,%d", &a.activity, &a.value);

Тогда в вашем формате файла:

i 23
i 56
i 19
i 20
i 44

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

fscanf(fp, "%c %d\n", &a.activity, &a.value);

Помните, fscanf не просто читает значения по порядку, он учитывает фиксированные символы, окружающие символы подстановки.

Редактировать - также важно, указал Кит в комментариях:

Обратите внимание, что использование \n в строке формата fscanf может быть немного вводит в заблуждение. Любой символ пробела (включая \n) соответствует нулю или больше пробелов. Таким образом, добавление \n работает для данного вход - но это также будет работать, если все входные данные были в одной строке разделенные пробелами или табуляцией: i 23 i 56 i 19 i 20 i 44. Если ты действительно для ввода строки, используйте fgets() (не gets()) для чтения строки за раз в строку, затем sscanf() для разбора строки. (Все У *scanf() функций есть проблемы с переполнением чисел.)

Надеюсь, это поможет!

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

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

a.activity не инициализируется до тех пор, пока fscanf не вернется в первый раз. Пока вы отлаживаете, имейте это в виду. Большинство отладчиков помещают курсор в первую строку, которая еще не была выполнена; поэтому, когда строка fscanf будет выделена в первый раз, a.activity еще не будет инициализирован и может иметь какое-либо значение в ней.

...