2013-03-18 30 views
-1

由於某種原因,我不知道爲什麼,我的fscanf代碼不起作用。我的朋友擁有相同的作業和相同的代碼適合他。爲什麼我的fscanf不工作?

ISBNPrefix::ISBNPrefix(const char * filename) { 
    FILE * prefixFile = NULL; 

    if (filename != NULL) 
    prefixFile = fopen(filename, "r"); 
} 

bool ISBNPrefix::isRegistered (int area) const { 
    int areaDigit = 0; 
    bool check = false; 

    //rewind(prefixFile); 

    while(fscanf(prefixFile, "%d %*[^ ] %*[^\n]", &areaDigit) != EOF) { 
     if (areaDigit == area) { 
      check = true; 
      break; 
     } 
    } 

    return check; 
} 

它不正確fscanf,它應該在某些測試中返回true,但它返回false;我認爲它沒有正確掃描。任何人都可以看到有什麼不對?

我的文本文件的第一個四行是:

0 00 19 
0 200 699 
0 7000 8499 
0 85000 89999 
+0

它通常有助於提供一個最小的例子:一段代碼(和樣品輸入),其他人可以運行重現你的錯誤。傾銷某些缺少代碼的代碼有時會使其更難以提供幫助。 – 2013-03-18 18:08:29

+0

整個程序對我來說太長了,無法複製和粘貼所有程序。我試圖包括什麼是相關的。 @chrisaycock有3個部分的文件行,在那個函數中我只檢查第一部分 – user2140629 2013-03-18 18:09:50

+0

但是我添加了%* [^]表示不保存該部分的「*」。我的朋友擁有相同的代碼,適用於他。 @chrisaycock – user2140629 2013-03-18 18:14:28

回答

2

這條線:

while(fscanf(prefixFile, "%d %*[^ ] %*[^\n]", &areaDigit) != EOF) { 

  • 讀一個數字areaDigit,然後
  • 跳過空白在輸入中,然後
  • 讀取一個或多個非空格字符,然後
  • 再次跳過空格,然後
  • 讀取並放棄直到下一個換行符的所有字符。

如果在讀取areaDigit的編號之前到達文件末尾,則循環結束。因此,例如與輸入,如:

123 456 789 
555 xxx yyy 

它將循環兩次areaDigit爲123和555

有了這樣的輸入:

1 2 3 4 5 6 7 8 9 
a b c d e f g h i 

它會讀取1,然後進入一個無限循環無法讀取第二行(全程使用areaDigit == 1)。

輸入如:

1 
2 
3 
4 
5 
6 
7 

它將循環3次areaDigit爲1,1,4和7

+0

那麼一個修復會掃描所有3個部分沒有「*」?生病編輯我的問題與文本文件的前4行的示例 – user2140629 2013-03-18 18:37:03

+0

@ user2140629:解決什麼問題?你仍然沒有說過什麼是錯的,或者你期望什麼,或者你想要達到什麼目的。 – 2013-03-18 20:41:32