我正在尝试从一个文件读入,我无法正确地获得它的模式。有人可以告诉我我能做些什么让它发挥作用吗?
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
答案 0 :(得分:1)
如果无法打开文件,则会打印一条消息,然后继续。相反它应该从main返回。
if (fp == NULL) {
printf("cannot open file\n\n");
return 1;
}
fscanf将返回解析的项目数,因此在返回的数字时停止读取可能更安全< 4(并非所有项目都可以阅读)。
据推测,“data.dat”包含多条记录,每行都有一行结尾。这意味着在读取第一个记录后,文件中的下一个字符是以“risk:0.0”行结尾的行。您应该使用\n
结束fscanf模板。
这是因为第二次尝试解析文件时,fscanf会看到它不期望的那个字符(fscanf模板以“name:”开头),所以它会停止读取,你会得到只有第一张唱片。
答案 1 :(得分:1)
您应该将“{name”格式说明符从%s
更改为%19s
,以使其最多读取19个字符(+终止'\ 0')。你现在拥有它的方式是保证失败,以防有人给你20多个角色名称。
答案 2 :(得分:-1)
有人可以告诉我我能做些什么才能让它发挥作用吗?
我建议你在不同的陈述中分开功能 不要试图在1个语句中填写所有程序功能。
你的重要声明是做三件事:
scanf
的返回值与EOF
我建议你为3种不同的行为做(至少)3种不同的陈述。
提示:仅将scanf的返回值与EOF进行比较有点太短