2013-04-28 52 views
1

我想弄清楚爲什麼這是現在破產,因爲我有它的工作,我不知道什麼是錯的。我正在嘗試從已打開的文件中獲取簡單的getline,但是,編譯器不斷給我提供錯誤。我試圖找到其他人有這些問題,但我一直無法找到任何其他人。有什麼建議?Getline問題與輸入的打開文件流

void Foo::bar(ifstream &inputFile) 
{ 
// Read in the data, parse it out, and 
// call loadQueue 
string input; 
do {  
    getline(inputFile, input); 
    loadQueue(input); 
}while (!(inputFile.eof())); 

} 

這是我得到的回報:

g++ -c -o Airworthy.o Airworthy.cpp 
Foo.cpp: In member function ‘void Airworthy::readData(std::ifstream&)’: 
Foo.cpp:25:27: error: no matching function for call to ‘getline(std::ifstream&, std::string&)’ 
Foo.cpp:25:27: note: candidates are: 
In file included from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/string:55:0, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/locale_classes.h:42, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:43, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40, 
      from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40, 

在這個問題上是什麼任何想法?

+0

除了Andy所說的,你可能會爲文件的最後一行調用兩次loadQueue。改變你的循環爲'while(getline(inputFile,input)){loadQueue(input); }'。 – 2013-04-28 15:13:12

+0

請向我們展示整個錯誤消息。爲了詳細闡述sftrabbit,當沒有更多輸入時,'eof()'不會返回true,它只會在輸入操作由於eof而失敗後返回true。 – Potatoswatter 2013-04-28 15:50:45

+0

@Patatoswatter否。問題是_until_輸入失敗,'eof()'可能會或可能不會返回'true'。讀完最後一行(或最後一個輸入,不管它是什麼)後,'eof()'可以返回'true'或'false';你不能確定哪一個。 – 2013-04-28 16:06:35

回答

4

很可能你忘了#include所有標準的標題。一種可能性是:

#include <fstream> 

或許你忘了:

#include <string> 

你總是要#include所有相關標準的頭明確,而無需通過其他一些頭依靠間接的包容性。

+0

沒有意義。該聲明應在''中,並且在他向我們顯示的診斷消息部分中已經提到。沒有得到適當的'getline'超載,你不能得到'std :: string'。 – Potatoswatter 2013-04-28 15:48:20

+0

@Potatoswatter:我試過'#include'ing'',那正是我得到的錯誤。 – 2013-04-28 15:49:10

+0

啊,因爲它不知道'ifstream'是從'istream'派生的。好吧,+1。但另一個解決方法是採用'istream&'參數。通常'fstream'參數是一個錯誤。 – Potatoswatter 2013-04-28 15:52:14

1

正如Andy所說,您需要適當的包括。還有, 然而,與您的代碼(其中一個 的會影響到你需要的,其中包括)至少其他兩個主要問題:

  • 你不應該(或幾乎沒有)通過ifstream作爲 參數一個函數。除非函數要執行 openclose,否則您應該通過它std::istream&,以便 它可以用任何istream調用,而不僅僅是ifstream

    一旦你改變了這個,你需要包括<istream>, 而不是<fstream>。 (<fstream>包括<istream>。而很多 更多,你不需要。)

  • ,你不應該在! inputFile.eof()循環。它不是 工作。在你的情況下,循環應該是

    while (std::getline(inputFile, input)) {4 
        // ... 
    } 
    

    它的工作原理,幾乎沒有別的。

    一般而言,當 進行輸入時,do...while循環幾乎總是錯誤的;它會導致你的處理,即使 失敗輸入(你做—的 getline後的任何使用input但測試getline是否成功 是錯誤之前)。在輸入失敗之前,inputFile.eof()的結果不是 確實很好定義。使用 istream::eof()來控制一個循環幾乎總是一個錯誤。

+0

函數被調用通過文件打開後的主應用程序。在函數調用之後,文件關閉。但我肯定會解決循環問題。我很欣賞這方面的建議。 – johwiltb 2013-04-28 16:59:59

+0

@johwiltb無論函數何時被調用,如果一個函數沒有使用任何嚴格爲'ifstream'的接口,就像'open'和'close',那麼它應該接受一個'istream&',而不是' ifstream的&'。在實踐中,一個應用程序以'ifstream'開始是非常普遍的,只是稍後在家中進行自定義切換;您不希望必須找到從流中讀取的每個函數,然後更改它們。 – 2013-04-28 17:17:13