我正在阅读记录,使用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
答案 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 */
}
sizeof pRecords / sizeof *pRecords
是数组中元素(指针)的数量sizeof **pRecords
是每个(取消引用)元素的大小