簡體   English   中英

讀取超出 istringstream 字符串的末尾。

[英]Reading beyond the end of an istringstream's string.

作為一名初級程序員,我試圖理解我書中的所有內容,但是在理解我為查看其行為而編寫的這段代碼時遇到了一些問題。

假設我想將數據讀入一個字符串,清理這些數據,然后將“清理過的”數據放入 istringstream 中,以便我可以再次讀取它:

string line; 
getline(cin, line); 

// clean up data....

istringstream ss(line);
vector<string> vs; 
for (string word; ss >> word; )
    vs.push_back(word); 

現在,通過編寫這段代碼,我想起了我書中的一句話:

如果您嘗試讀取 istringstream 字符串的末尾,它將進入 eof() 狀態。

所以我嘗試用兩個if條件測試for loop之后的流,我得到它既處於eof() 狀態又處於fail() 狀態 流是否可能同時處於這兩種狀態? 為什么我得到這個結果? 如何在輸入操作后正確找到流的真實狀態? 我剛剛開始學習 I/O 流,但遇到了一些問題。 感謝您的幫助

您的流絕對有可能同時處於 eof 和 failed 狀態。 當您嘗試閱讀流的末尾時會發生這種情況。 這是在您讀完所有內容並測試沒有任何剩余內容后流的正確狀態。

這正是您的循環所做的,並且絕對可以這樣做。 當您的流定位在其最后一個字符之后時,尚未設置 eof 標志。 一旦您嘗試閱讀更多內容,它就會設置。 這是設計使然。 一旦你讀了更多, eof 和 failed 標志都會被設置,這會導致循環終止,正如預期的那樣。

您正在通過operator bool檢查流狀態; 現在返回!this.fail()如果設置了failbitbadbit則為true ,而不是eofbit

當您到達 EOF(即讀取流的末尾)時, >><<行為是設置eofbitfailbit

如何在輸入操作后正確找到流的真實狀態?

您已經在以正確的方式進行operator bool ,即通過operator bool - 您可能想要進一步了解它是查找iostate -s 及其訪問器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM