2011-07-09 70 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多個字符的情況下失敗。