使用fscanf从文件中读取数据(遵循特定模式)

时间:2011-07-09 21:32:14

标签: c

我正在尝试从一个文件读入,我无法正确地获得它的模式。有人可以告诉我我能做些什么让它发挥作用吗?

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 个答案:

答案 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进行比较有点太短