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

how does getline() work in terms of pointer?

我想知道 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;
}

I thought that ss is altered every time getline() works,

没错。

but i realized that it is not true because printing ss.str() after each loop always gives the original stringstream.

这并不意味着什么都没有改变。 stringstream 的状态包括文本内容、该内容中的位置(以及更多):当您调用 .str() 时,您将获得全部内容,但是当您使用 getline 解析一些内容时,您更改未来查询使用的位置状态,以及 - 可能 - fail/bad/eof 流状态。

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

的 src 中找到更多示例和信息