fscanf () читает только в одной записи и игнорирует остальные - PullRequest
1 голос
/ 15 июля 2011

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

#include <stdio.h>
#include <stdlib.h>
//STRUCTURE
typedef struct{
    char name[20];
    int age;
    float highBP;
    float lowBP;
    float riskFactor;


    } patient; 

    patient *pRecords[29];
    int counter = 0;
int main(int argc, char **argv)
{




int i=0;
for(;i<30;i++){

    pRecords[i] = (patient *)malloc(sizeof(patient));

}
FILE *fp;
fp = fopen("data.dat", "r");

if(fp == NULL){

    printf("cannot open file\n\n");
return 1;
}


    while(fscanf(fp, "name:\t%s\nage:\t%d\nbp:\t%f %f\nrisk:\t%f\n\n", pRecords[counter]->name, &pRecords[counter]->age, &pRecords[counter]->highBP, &pRecords[counter]->lowBP, &pRecords[counter]->riskFactor) == 5){
    //printf("%d\n",fscanf(fp, "name:\t%s\nage:\t%d\nbp:\t%f %f\nrisk:\t%f\n\n", pRecords[counter]->name, &pRecords[counter]->age, &pRecords[counter]->highBP, &pRecords[counter]->lowBP, &pRecords[counter]->riskFactor));

    printf("%s\n", pRecords[counter]->name);
    printf("%d\n", pRecords[counter]->age);
    printf("%f\n", pRecords[counter]->highBP);
    printf("%f\n", pRecords[counter]->lowBP);
    printf("%f\n", pRecords[counter]->riskFactor);
        counter++;
    }

}

data.dat

name:   hank
age:    32
bp:     32.00 32.00
risk:   0.0

name:   tom
age:    21
bp:     121.00 81.00
risk:   2.0

name:   cindy
age:    32
bp:     190.00 900.00
risk:   5.0

1 Ответ

2 голосов
/ 15 июля 2011

Вы определяете массив с пробелом для 29 элементов

patient *pRecords[29];

, а затем приступить к присвоению значений 30 элементам.

for(;i<30;i++){

    pRecords[i] = (patient *)malloc(sizeof(patient));

}

Не делай этого! Может произойти все что угодно, включая поведение, которое ты описал.

Кроме того, не приводите возвращаемое значение malloc(). В лучшем случае это избыточно и может скрывать ошибку, которую компилятор мог бы обнаружить при отсутствии ложного преобразования.


Мне нравится использовать информацию, которую компилятор уже знает, для циклов, malloc и прочего

patient *pRecords[29];
for (size_t i = 0; i < sizeof pRecords / sizeof *pRecords; i++) { /* 1 */
    pRecords[i] = malloc(sizeof **pRecords);                      /* 2 */
}
  • line / * 1 * /: sizeof pRecords / sizeof *pRecords - количество элементов (указателей) в массиве
  • line / * 2 * /: sizeof **pRecords - размер каждого (разыменованного) элемента
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...