2011-07-14 45 views
-1

什麼時候C++中的getline失敗?什麼時候會在C++中執行getline函數調用時設置failbit?

我的代碼片段大,我是無法將其全部五花八門的理由進行粘貼。我試圖從一個文件中讀取,我知道它存在幷包含數據,在C++中使用getline。但getline無法返回錯誤123-無效名稱(getlasterror的輸出)。我查了一下讓我更加困惑的錯誤代碼。

我在打開文件時進行錯誤檢查。所以我肯定我有處理文件。 請不要粘貼代碼。我對C++很陌生,特別是在windows中。任何關於getline的建議或見解都會有所幫助。我正在嘗試讀取由編譯器轉儲的文件。

這是摘自代碼

ifstream inFile("C:\...\ash.txt",ios::in); 

string singleLine; 

getline(inFile,singleLine); 

SINGLELINE是空的!我正在做一些愚蠢的事情..請指出這對我來說!欣賞它

重要編輯:

我檢查了ios的成員,發現失敗位。爲什麼會設置失敗位?該文件確實存在,我也想知道如何Windows暴露文件擴展名可能會導致一個問題。這似乎沒有問題。我錯過了什麼?

+0

粘貼,然後只是打開文件和閱讀與getline ... –

+0

它可能已經達到EOF。檢查流,如果它是'壞()' –

+0

@hexa我檢查了壞位..失敗位是那個失敗 – ash

回答

1

如果fail位設置,很可能是因爲您沒有成功打開該文件。檢查ifFile.is_open()是否返回true;如果不是,那麼可能表示該文件未正確打開。您可能沒有權限,或者您可能需要正確地轉義字符串,否則文件可能會被鎖定。

您也應該檢查是否是fail前和調用getline後設置。如果是之前,那可能意味着該文件未打開。如果它在後面,可能意味着文件是空的。

這可能是Windows正在瞞着你真正文件擴展名的情況。例如,如果您將Explorer配置爲隱藏文件擴展名,則文件名實際上可能會命名爲ash.txt.txt。如果文件沒有打開,這可能是值得研究的。

4

GetLastError只告訴你的Win32 API調用,這std::getline不是。

檢查失敗的iostream的成員,例如, rdstate()

getline之前調用ios::exceptions(eofbit | failbit | badbit)並捕獲得到的異常可能會或可能不會爲您提供更具描述性的錯誤消息。

+0

它看起來像失敗位設置 – ash

0

您是否需要在文件路徑中轉義反斜槓?

+0

不,我也試過 – ash

0

無法打開文件。

這是因爲您沒有指定正確的路徑。

這是因爲你使用了\作爲路徑分隔符的古老的windows慣例。
這也恰好是C.

轉義字符這就是爲什麼視窗,您可以使用/作爲路徑分隔符(並已超過十年做了),因爲使用「/」是如此的容易出錯。

你的路徑應該是:

ifstream inFile("C:\\...\\ash.txt"); 

// Or my preference 

ifstream inFile("C:/.../ash.txt"); 

甚至更​​好的使用提升。

相關問題