2014-02-27 36 views
1

CODE: -關於的fscanf空白查詢()

while (fscanf (fp,"%s %d %f", e.name, &e.age, &e.bs) !=EOF) 
{ 
    printf ("%s  %d  %f\n", e.name, e.age, e.bs) ; 
} 

說我有一個文件下面的句子: -

FNAME LNAME 20 200000

fname1 lname1 30 50000

期望的輸出是: -

fname lname  20  200000.0000 

fname1 lname1  30  50000.0000 

但我得到的輸出是: -

fname  (garbage value)  (garbage value) 

lname  20  200000.0000 

fname1  20  200000.0000 

lname1  30  50000.0000 

上述問題是由於這樣的事實:%s不讀白的空間,因此它被分裂我fname lname分爲兩個部分。

是否有解決方案來獲得所需的輸出?

回答

1

您需要在fscanf中使用%s %s,並將名字和姓氏讀入單獨的變量,然後手動將它們連接起來。 (使用snprintf%s %s爲您的格式字符串。)

char first[200], last[200]; 
while (fscanf(fp, "%200s %200s %d %f", first, last, &e.age, &e.bs) == 4) 
{ 
    snprintf(e.name, sizeof(e.name), "%s %s", first, last); 
    printf ("%s  %d  %f\n", e.name, e.age, e.bs) ; 
} 

如果名字有時可有兩個以上的部分,則需要使用一些更高級的解析字符串(正則表達式是一種方法),或者要繼續使用fscanf,則需要在名稱和數字之間插入明確的分隔符。

+0

爲什麼你做了'== 4' –

+0

'fscanf'返回找到的匹配數量。它將匹配4件事情。更少,它在中間失敗。 – StilesCrisis

+0

所以'!-EOF'也在我的情況下工作 –