2016-01-20 71 views
2

我想知道,則對getline()函數指針方面是如何工作的。 在下面的代碼,對於病情的同時,如何爲函數getline()不是從SS的每一個循環後,一開始起步,但它遇到了最後一個分隔符之後。我認爲每次getline()都會改變ss,但是我意識到這不是真的,因爲在每個循環後面打印ss.str()總是會給出原始的字符串流。所以我認爲它必須不得不對指針做些事情。getline()如何在指針方面工作?

#include <sstream> 
#include <vector> 
#include <iostream> 
using namespace std; 

vector<int> parseInts(string str) { 

    stringstream ss(str); 
    vector<int> result; 
    string ele; 
    while(getline(ss, ele, ',')) 
    { 
     result.push_back(atoi(ele.c_str())); 
    } 
    return result; 
} 

int main() { 
    string str; 
    cin >> str; 
    vector<int> integers = parseInts(str); 
    for(int i = 0; i < integers.size(); i++) { 
     cout << integers[i] << "\n"; 
    } 

    return 0; 
} 
+2

流有一個「當前位置」這是更新。流的內容不會改變。 – molbdnilo

+1

擴展@molbdnilo的註釋,注意's'tellg()'和'ss.tellp()'的輸出,當你添加和讀取'ss'時。 – user4581301

回答

2

我認爲ss改變每次getline()作品,

這是真的。

但我意識到這是不正確的,因爲每個循環後打印ss.str()總是給出原始的字符串流。

這並不意味着什麼也沒有改變。一個stringstream的狀態包括文本內容,職位的內容中(及以上):當你調用.str()你得到的全部內容,但是當你分析一些列與getline你改變由將來的查詢使用的位置狀態,以及 - 可能 - 的fail/bad/eof流狀態。

0

你可以找到例如從gcc src code of std::istream在行01180的詳細信息,你可以看到 __c = __sb->sbumpc(); 從輸入流中乳寧功能sbumpc()from here從streambuf __ret = traits_type::to_int_type(*this->gptr()); 讀取當前的符號不是增加指針的當前值 讀取下一個符號從程序的當前位置應該讀下一個數據 this->gbump(1) 和不是返回下一個從流下一個符號,以便操作getline()只是改變流緩衝的內一個指針。但是,當您爲stringstream運行str()時,將從streambuf中讀取所有數據,而不使用改變的指針。希望這可以幫助你也可以找到更多的例子和信息在src的gcc