Чтение данных из файла с использованием fscanf (по заданному шаблону) - PullRequest
1 голос
/ 10 июля 2011

Я пытаюсь прочитать из файла, и я не могу понять, как это правильно.Может кто-нибудь сказать мне, что я могу сделать, чтобы заставить его работать?

int main()
{

char name[20];
int age;
float highbp, lowbp, risk;
FILE *fp;
fp = fopen("data.dat", "r");

if(fp == NULL){

    printf("cannot open file\n\n");

}

while(fscanf(fp, "name:%s\nage:%d\nbp:%f\nrisk:%f", name, &age, &highbp, &risk) != EOF){


}
printf("Name: %s\n", name);
printf("%d\n", age);
printf("%f\n", highbp);
printf("%f\n", risk);

}

data.dat:

name:tom
age:32
bp:43.00
risk:0.0

Ответы [ 3 ]

1 голос
/ 10 июля 2011

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

if (fp == NULL) {
    printf("cannot open file\n\n");
    return 1;
}

fscanf возвращает количество проанализированных элементов, поэтому, вероятно, безопаснее прекратить чтение, когда возвращенное число <4 (не все элементы могут быть прочитаны). </p>

Предположительно, "data.dat" содержит несколько записей, и каждая строка имеет конец строки. Это означает, что после прочтения первой записи следующий символ в файле - это строка, заканчивающаяся строкой «risk: 0.0». Вам следует завершить шаблон fscanf с помощью \n.

Это потому, что во второй раз, когда он пытается проанализировать файл, fscanf увидит тот символ, которого он не ожидает (шаблон fscanf начинает "name:"), поэтому он перестанет читать и вы получите только первая запись.

1 голос
/ 10 июля 2011

Вы должны изменить спецификатор формата "name" с %s на %19s, чтобы он читал не более 19 символов (+ заканчивая '\ 0').Теперь у вас есть гарантированный сбой на тот случай, если вам дадут 20+ имен персонажей.

0 голосов
/ 10 июля 2011

Может кто-нибудь сказать мне, что я могу сделать, чтобы заставить его работать?

Я предлагаю вам разделить функциональность в разных утверждениях.
Не пытайтесь втиснуть всефункциональность программы в 1 операторе.

Ваш большой оператор делает 3 вещи:

  • он читает данные из файла
  • он сравнивает возвращаемое значение scanf с EOF
  • он контролирует, когда прекратить чтение

Я предлагаю вам сделать (как минимум) 3 разных утверждения для 3 различных действий.

Подсказка: сравнение возвращаемого значения scanf только с EOF слишком короткое

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...