2011-07-09 29 views
1

我正在尝试从文件读入数据,但无法获取正确的模式。有人能告诉我,我能做些什么才能使它工作?使用fscanf读取文件中的数据(遵循特定模式)

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

检查fp == NULL应该返回错误,现在它的进程 – Ulterior

回答

1

如果它不能打开它打印消息的文件,但随后继续。相反,它应该从主返回。

if (fp == NULL) { 
    printf("cannot open file\n\n"); 
    return 1; 
} 

的fscanf将返回解析的项目数,所以它可能是更安全的停止阅读时,返回的数字< 4(没有可以读取所有项目)。

推测“data.dat”包含多条记录,每行有一行结尾。这意味着在读取第一条记录后,文件中的下一个字符是以“风险:0.0”行结束的行。您应该使用\n来结束fscanf模板。

这是因为第二次尝试解析文件时,fscanf会看到该字符,它并不期待(fscanf模板启动“name:”),因此它将停止阅读,并且您将只获得第一条记录。

+0

while(fscanf(fp,“name:%s \ nage:%d \ nbp:%f \ nrisk:%f \ n“,name,&age,&highbp,&risk)== 4);诀窍 –

-1

有人能告诉我,我能做些什么来得到它的工作?

我建议你在不同的语句中分开功能。
不要试图在1条语句中填充所有程序功能。

你很大的声明是做三件事情:

  • 它是从文件中读取数据
  • 它与EOF
  • 它控制何时停止阅读scanf返回值进行比较

我建议你为3种不同的行为做(至少)3种不同的陈述。

提示:scanf函数的返回值只与EOF比较是有点太短

+1

o0你们这么快就downvote在这里,它伤害:) – Ulterior

1

您应该将“名称”格式说明符从%s更改为%19s,使其最多读取19个字符(+终止'\ 0')。你现在拥有的方式是保证在某人给你20多个字符的情况下失败。