getline()如何在指针方面工作?

时间:2016-01-20 05:44:26

标签: c++ pointers getline

我想知道getline()函数如何在指针方面工作。 在下面的代码中,对于while条件,getline()不是从每个循环之后的ss的最开头开始,而是在它遇到的最后一个分隔符之后。我认为每次getline()工作都会改变ss,但我意识到这不是真的,因为在每个循环之后打印ss.str()总是给出原始的字符串流。所以我假设它必须要用指针做一些事情。

#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 个答案:

答案 0 :(得分:2)

  

我认为每次ss工作时getline()都会被更改,

那是真的。

  

但我意识到这不是真的,因为在每个循环之后打印ss.str()总是给出原始的字符串流。

这并不意味着什么都没有改变。 stringstream状态包括文本内容,该内容中的位置(以及更多):当您致电.str()时,您获得了整个内容,但是当您使用{{1}解析某些内容时您更改了未来查询使用的排名状态,以及 - 可能 - getline / fail / bad流状态。

答案 1 :(得分:0)

您可以在01180行中找到更多信息,例如来自gcc src code of std::istream的信息 __c = __sb->sbumpc(); 通过运行函数sbumpc() from here从输入流中读取下一个符号,该函数从streambuf读取当前符号 __ret = traits_type::to_int_type(*this->gptr()); 比从程序增加指针当前位置的当前值应该读取下一个数据 this->gbump(1) 然后从流返回下一个符号,以便操作getline()只改变streambuf的内部一个指针。但是当您为stringstream运行str()时,从streambuf读取所有数据而不使用更改的指针。希望这有助于您在gcc的src中找到更多示例和信息