2013-02-09 73 views
1

我有一段在gcc,VS2010上運行良好的代碼。我試圖在VS2012中編譯相同的代碼。我知道我的設置在任何地方都是成立的,但它不是實際的代碼。我縮短了重現問題的代碼。stream seekg()實現從VS2012到2010不等

std::ifstream file_stream; 
file_stream.open("C:\\experiment\\file.txt", std::ios_base::in); 
std::istream& stream = file_stream; 
bool done = false; 
while(stream.good() || !done){ 
    int stream_position = stream.tellg(); 
    bool stream_failure = (stream_position == -1); 
    bool stream_eof = stream.eof(); 
    std::string line; 
    std::getline(stream, line); 

    std::cout << stream_failure << stream_eof << std::endl; 

    std::streampos pos = stream.tellg(); 
    if(pos == std::streampos(-1)){ 
     std::streampos copy = pos; 
     stream.seekg(0, std::ios_base::end); 
     pos = stream.tellg(); 
     stream.seekg(copy); 
    } 
} 
std::getline(std::cin, std::string()); 
file_stream.close(); 

如果我改變平臺的工具包,VS2010到位的stream_eof
作品和版畫1如果我改變平臺的工具包,VS2012它代替stream_eof 不和打印0已經達到後EOF

如果我把一個if(stream_eof)return 0; COUT後返回上VS2010但在VS2012

+0

「效果很好海合會」 ---不適合我。 – 2013-02-09 19:59:49

回答

2

它的C++ 03和C++ 11之間的差異一個不返回。

在C++ 03中,當您在設置了任何錯誤位的流上調用seekg()時,它會失敗並且不會執行其他任何操作。

在C++ 11中,seekg()首先無條件地清除eofbit,然後嘗試按照講述的方式進行操作。在這種情況下,因爲failbit也被設置,所以它失敗,但是eofbit保持清除。

(順便說一下,爲什麼你的循環設念過去擺在首位文件的末尾?使用通常while(getline(stream, line))

+0

我不記得爲什麼我這樣編碼,實際上有時候主解析器將流外包給這個函數,當內部函數碰到eof時,可能是主解析器面臨的問題,這是一個解決方法。但是現在的工作是什麼使它在兩者上都能工作?我檢查並驚訝爲什麼seekg()清除eof位? – 2013-02-10 05:18:00

+0

@Neel Basu它清除了它(從C++ 11開始),使得可以在不需要額外工作的情況下從文件末尾尋找,這是一種常見的用例。 – Cubbi 2013-02-10 05:20:41