2012-07-30 54 views
2

當我輸入is.seekg(0)時,它將我帶到我的流的開頭。但是,當我輸入is.seekg(ios :: end)時,它將我帶到第二個字符。爲什麼會發生。我認爲我對此的誤解源於對流如何運作的根本缺乏理解。我會認爲,當你提供常量ios :: end時,它會把你帶到那個流的末尾。但是,它似乎讓你向前移動了一個角色。Istream seekg()偏移量和ios ::結束

cin.seekg(0, ios::end); 
    int length = cin.tellg(); 
    cout << length << endl; 

    cin.seekg(0); 

    cout << cin.tellg(); 

當我輸入<文件包含 「123456789」

的輸出是10 0

現在,如果我這樣做:

cin.seekg(ios::end); 
    int length = cin.tellg(); 
    cout << length << endl; 

輸出是2

這是爲什麼?

回答

2

您正在將std::ios_base::seekdir類型的東西轉換爲std::istream::pos_type類型,並調用只有一個參數的seekg版本。該版本的seekg將指針移動到絕對位置,而不是相對位置。

ios::end是用於相對偏移量的邏輯位置,而不是絕對位置。

1

你不能依靠STDIN尋找。這是因爲它可能來自多個來源,包括絕對不可尋求的管道。由於STDIN綁定到文件流,因此重定向文件時可能會有效。我不知道你是否可以依靠這一點,但這是我的猜測。我從來沒有考慮過在STDIN上尋找。我總是認爲它是一個管道,即使它不是。與STDOUT一樣。我不會輸出一些內容,然後嘗試回溯並「覆蓋」該輸出。如果你發現自己需要尋找標準流,你應該重新考慮你的方法。

2

此代碼只是工作由事故

cin.seekg(ios::end); 
int length = cin.tellg(); 
cout << length << endl; 

end來自一個enum seekdir {beg, cur, end};,所以ios::end恰好是轉換爲與價值2整數。

只是不幸的是,seekg的一個過載參數是一個整數,所以這個調用變成了cin.seekg(2)。雖然技術上有效的代碼,但這絕對不是你想要的。