簡體   English   中英

stringstream >>運算符

[英]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.

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