fscanf()只读取一个记录,忽略其余记录

时间:2011-07-15 08:51:40

标签: c

我正在阅读记录,使用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 个答案:

答案 0 :(得分:2)

定义一个包含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是每个(取消引用)元素的大小