[英]stringstream >> operator
我有這個代碼:
std::string s = "\n\n\n\n+\n\n\n+";
std::stringstream serializedDataStream(s);
std::string plusCharacter, plusCharacter2;
serializedDataStream >> plusCharacter ;
cout << "plusCharacter "<<plusCharacter << "\n";
serializedDataStream >> plusCharacter2 ;
cout << "plusCharacter "<<plusCharacter2;
//OUTPUT:
// plusCharacter +
// plusCharacter +
這意味着stringsteam
>>
運算符跳過了新行。 我查看了std::stringstream
文檔但我無法找到解釋為什么會發生這種情況的原因。 這是編譯器特定的行為,還是我可以依賴於此?
這是因為operator>>
表現為格式化的輸入函數 。 格式化輸入函數的部分過程是:
每個格式化的輸入函數通過使用
noskipws
(第二個)參數false構造類哨兵的對象來開始執行。
當noskipws
設置為false(並且流上的skipws
標志為true,這是默認值)時,只要下一個可用輸入字符c
是空白字符, sentry
對象“就會提取並丟棄每個字符”。
如果要一次讀取每一行,請使用std::getline
。 此函數表現為無格式輸入函數 ,其noskipws
設置為true並讀取一行文本(由行終止符定義(std :: getline()的參數3(默認為'\\ n')))。
表現為FormattedInputFunction。 在構造和檢查可以跳過前導空格的哨兵對象之后,提取連續的字符並將它們存儲在由s指向其第一個元素的字符數組的連續位置處。
因此,按照標准,它將沿着流中的任何東西蹣跚學步,直到它實際發現一些有趣的東西,然后讀回給你,然后停止。 然后下次再做同樣的事情。
另一方面, std::getline
將讀取下一個換行符的所有內容 (這將從流中刪除但不會返回給你)並在std::string
中將它全部返回給你。 然后由你來得到你想要的東西從(如數字) string
。
編輯:我正在努力通過默認語言環境確切地找到哪些字符被認為是空格。 我認為它將與為isspace
(繼承自c)定義的相同,即space (0x20), form feed (0x0c), line feed (0x0a), carriage return (0x0d), horizontal tab (0x09) and vertical tab (0x0b).
但是我無法說服自己100%在這種情況下它是一樣的。 我不熟悉語言環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.