2015-10-05 39 views
1

目前我正在學習C. 從文件中讀取反正切正題:Ç如何使用sscanf的正確支持

文本文件的內容:

123456 James Doakes; 0 
987987 Dexter Morgan; 0 
010203 Masuka Perv; 0 

int main() 
{ 
char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3]; 
int accountBalance = 0; 
char filename[] = "breg.txt"; 
FILE *file = fopen(filename, "r"); 
if (file != NULL) { 
    char line[128]; 
    while (fgets(line, sizeof(line), file) != NULL) { 
     sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
     printf("%s", ownerName); 
     //fflushstdin(); 
    } 
    fclose(file); 
} else { 
    perror(filename); 
} 
return 0; 
} 

我寫這個來檢查例如James Doakes的名字是否正確註冊:

printf("%s", ownerName); 

但是,當它打印出來就像標準輸出仍然是活動的,我可以推動回車,它會再次輸入名稱。我的目標當然是能夠將數字,全名和最後一個數字作爲單獨變量進行掃描。但它顯然不起作用。我猜測\ n也會被註冊。不知道,我只是在猜測。

我在做什麼錯?爲什麼?我該如何解決這個問題?

非常感謝, 米夫

+0

嘗試'sscanf(line,「%s%[^;];%d」,accountNr,ownerName,&accountBalance);'或檢查其返回值,int r = sscanf(line,「%s%[^ ;];%d「,accountNr,ownerName,&accountBalance);如果(r == 3)/ * accountNr,ownerName和accountBalance掃描成功*/else if(r == 2)/ * aaccountNr和ownerName掃描成功*/else if(r == 1)/ * aaccountNr掃描成功* /其他/ *沒有掃描成功:(* /' –

+0

當打印ownerName:'printf(「%s \ n」,ownerName)時還要添加一個''n'';' – chqrlie

回答

3
%s %[^;] %d 

指由空格,可選空格中,不是;,可選空格,那麼號碼的字符序列所終止的字符串。

你似乎是不掃描實際;人物本身,這樣,當你嘗試獲得號,;輸入流中會導致失敗。

#include <stdio.h> 

#define ACCOUNTNRSIZE 100 
#define NAMESIZE 100 

int main (void) { 
    char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3]; 
    int accountBalance = 0; 
    char filename[] = "breg.txt"; 
    FILE *file = fopen(filename, "r"); 
    if (file != NULL) { 
     char line[128]; 
     while (fgets(line, sizeof(line), file) != NULL) { 
      int count = sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
      printf ("%d [%s] [%s] [%d]\n", count, accountNr, ownerName, accountBalance); 
     } 
     fclose(file); 
    } else { 
     perror(filename); 
    } 
    return 0; 
} 

它輸出:你可以看到這個

2 [123456] [James Doakes] [0] 
2 [987987] [Dexter Morgan] [0] 
2 [010203] [Masuka Perv] [0] 

事實上,即使你改變breg.txt文件是:

123456 James Doakes; 314159 
987987 Dexter Morgan; 271828 
010203 Masuka Perv; 42 

你仍然得到0的帳戶因爲掃描只能成功讀取兩個項目。


每當您使用的scanf - 家庭功能之一,你應該檢查返回代碼,以確保它的掃描項目的正確的號碼,如:

int count = sscanf (line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
if (count != 3) { 
    fprintf (stderr, "Catostrophic failure, count is %d\n", count); 
    return 1; 
} 

的修復這裏相對簡單,只需使用%s %[^;]; %d作爲格式字符串。

隨着這種變化,你可以看到輸出是:

3 [123456] [James Doakes] [314159] 
3 [987987] [Dexter Morgan] [271828] 
3 [010203] [Masuka Perv] [42] 

記住你實際上並不需要之前%d的空間(雖然它不會造成傷害)。該特定格式說明符在嘗試掃描數字之前跳過空格。

+0

完美,我也意識到我可能是在昨天的正確軌道上,但作爲一個新手,你不知道問題出在哪裏,所以你最終試圖修復好的代碼,認爲它的代碼不好。謝謝! –