2016-10-28 40 views
0

我有一個讀取文件的問題,在Windows上打開fstream。閱讀文件內容與ifstream打開

文件成功打開,它沒有錯誤,但循環getline沒有內容。

除此之外樣本完美運行,並打印整個文件內容

std::copy(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>(), 
      std::ostream_iterator<std::string>(std::cerr, "\n")); 

在Linux上一切都是完美的,相同的文件,同樣的代碼,函數getline循環讀取所有。

的Visual Studio 2013

編輯:

我忘了提,我有這個代碼的小線週期之前,函數getline

std::cout << file.rdbuf(); 

在Linux上這一行只是打印文件內容,在它不僅打印,但使文件無法訪問到std::getline

+0

while循環後,因此,如果您打印'strings.size()'你得到零? – NathanOliver

+0

@NathanOliver yep – tty6

+2

該文件是一個文本文件嗎?第一個字符是0x1A?在Windows中,有特殊字符或字節值表示文件狀態結束。如果您的文件在開頭*處包含這些文件,並且您沒有將文件作爲二進制文件打開*,則Windows操作系統將返回文件結尾狀態。 –

回答

3

getline()從輸入流中提取字符,直到達到換行符或delim這也是一個字符,但getline不僅僅是提取,getline放棄了刪除字符。檢查您的文件,看看您是否以newline character開頭,這意味着您在第一條以外的文件中啓動的文件。如果是這樣,

while (std::getline(file, str)) { 
    strings.push_back(str); 
} 

會始終iterate only 1 time,沒有返回字符,因爲它只是丟棄換行符。

while (std::getline(file, str) || !file.eof) { 
    strings.push_back(str); 
} 

現在,如果它跑入deliminating character,還檢查文件的結尾已經達到。

0

的問題是在呼喚

std::cout << file.rdbuf(); 

while(std::getline) 之前在Windows上線使得文件無法訪問到std ::函數getline

+0

調用它的原因是什麼? – Mikhail