2010-04-14 27 views
2

爲什麼這會失敗,它應該是簡單而且工作的?Fstream的tellg/seekg返回的值高於預期值

fisier.seekg(0, ios::end); 
long lungime = fisier.tellg(); 

這將返回比導致錯誤

char *continut = new char[lungime]; 

任何想法,問題可能是什麼文件的一個較大的值?

我也嘗試一次計數到文件末尾一個字符,即呈現相同的結果,數量高於預期。但使用getline()一次讀取一行,它的工作原理,沒有多餘的空格...

回答

8

在猜測,你打開翻譯模式下,可能在Windows下的文件。當您只是尋求文件末尾時,當前位置不考慮線端翻譯。一行(在外部文件中)的結尾標有對「\ r \ n」 - 但是當您讀入它時,它會轉換爲「\ n」。當您使用getline一次讀取一行時,\n也都會被丟棄,因此即使在沒有從外部轉換爲內部表示的系統(例如Unix/Linux)上,仍然可以期望那些給出不同的大小。

然後,你應該真的忘記new []存在。如果你想整個文件讀入一個字符串,嘗試這樣的事情:

std::stringstream continut; 
continut << fisier.rdbuf(); 

continut.str()然後從包含該文件的數據的std::string

+1

不錯!我一直想知道是否有一個簡單的方法來消耗一個std ::流。 – 2010-04-14 23:14:56

+0

@Jerry Coffin:比爾用純粹的尷尬取代了所有對他的'LoadFileAsString'函數的調用... – 2010-04-14 23:40:12

+0

@比利:它很漂亮,不是嗎?它真的值得被人們更好地瞭解...... – 2010-04-14 23:41:59

1

傑裏棺材是正確的線路結局。

但是,您不必使用stringstream來正確讀取整個文件。你只需要通過在std :: ifstream構造函數中使用std :: ios :: binary將其打開爲二進制。