我注意到,當我使用istringstream時,即使整個字符串被「消耗」,eof()也不會返回true。例如:爲什麼istringstream在流尾添加'-1'字符?
char ch;
istringstream ss{ "0" };
ss >> ch;
cout << ss.peek() << " " << (ss.eof() ? "true" : "false");
輸出(VS2015):
-1 false
我注意到,當我使用istringstream時,即使整個字符串被「消耗」,eof()也不會返回true。例如:爲什麼istringstream在流尾添加'-1'字符?
char ch;
istringstream ss{ "0" };
ss >> ch;
cout << ss.peek() << " " << (ss.eof() ? "true" : "false");
輸出(VS2015):
-1 false
eof()
不應該返回true
當所有的數據被消耗。它應該返回true
當您嘗試讀取更多數據比可用。
在這個例子中,你永遠不會這樣做。
尤其是,peek
是一個「請求」,即使沒有剩下可讀的內容也不會設置EOF;因爲你是,偷看。但是,將返回宏EOF
(通常爲-1)的值,這是您輸出peek()
的結果時所看到的值。沒有任何內容被「附加」到流中。
閱讀您使用的功能的文檔。
std::istream::peek
皮克下一個字符返回輸入序列, 下一個字符而不提取它:字符被留下作爲下一個字符到 從流中提取。
如果在調用之前已經設置了任何內部狀態標誌或在調用過程中將其設置爲 ,則該函數返回文件結束值(EOF)。
技術上這種效果可以根據平臺,-1實際上不是EOF的代碼 - EOF的代碼是26,但「傳輸結束」碼 - 255有些協議使用它積極,例如FTP使用它(不可能傳輸或創建一個帶有俄文字母я的文件 - 因爲在擴展ASCII中該字母代碼爲255 - Windows XP FTP非常明顯的一個問題) – Swift
@Swift:C宏EOF是獨立的來自ASCII控制代碼'EOF'。你說得對,它是實現定義的,可能不是-1,但它基本上總是(因爲沒有其他負值有目的,沒有正值或0是有意義的)。 –