【发布时间】:2011-06-08 23:13:25
【问题描述】:
就像我有一个 stringstream 变量包含 "abc gg rrr ff"
当我在那个stringstream 变量上使用>> 时,它给了我"abc"。我怎样才能得到剩余的字符串:" gg rrr ff"?似乎str() 和rdbuf() 都不起作用。
【问题讨论】:
标签: c++
就像我有一个 stringstream 变量包含 "abc gg rrr ff"
当我在那个stringstream 变量上使用>> 时,它给了我"abc"。我怎样才能得到剩余的字符串:" gg rrr ff"?似乎str() 和rdbuf() 都不起作用。
【问题讨论】:
标签: c++
您可以使用std::getline 从流中获取字符串的其余部分:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
stringstream ss("abc gg rrr ff");
string s1, s2;
ss >> s1;
getline(ss, s2); //get rest of the string!
cout << s1 << endl;
cout << s2 << endl;
return 0;
}
输出:
abc
gg rrr ff
演示:http://www.ideone.com/R4kfV
有一个重载的std::getline 函数,其中第三个参数带有一个分隔符,您可以在该分隔符上读取字符串。见std::getline的文档:
【讨论】:
operator>> 读取了所有内容,并且只填充了读取之间的空白分隔符? :|
std::getline 尊重流行为。在流行为中,您不能多次读取 same 输入。这就是流的意思。在这里查看我的答案以详细了解流的含义:stackoverflow.com/questions/6010864/…
std::getline 在应用于std::cout 时所做的相同:从当前流位置开始,一直读取到分隔符(默认为\n)或结束-文件。
getline(ss, s2, '\0'); 可能会更好。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string str("123 abc");
int a;
istringstream is(str);
is >> a;
// here we extract a copy of the "remainder"
string rem(is.str().substr(is.tellg()));
cout << "Remaining: [" << rem << "]\n";
}
【讨论】:
std::istringstream input;
int extracted;
input >> extracted;
IMO,您可能做的最简单的事情是:
std::stringstream tmp;
tmp << input.rdbuf();
std::string remainder = tmp.str();
这在性能方面并不是最优的。否则,直接访问stringbuffer(可能在流上使用rbuf().pubseekpos和tellg...尚未测试)。
【讨论】:
rdbuf() 存储剩余的字符串?
operator<< 的 streambuf 的定义方式是,它会做正确的事情,而您不必担心流的位置。
getline 从输入流中读取字符并将它们放入字符串中
【讨论】:
或者,如果您需要字符串的其余部分,您可以使用std::getline(my_stringstream, result, EOF),其中result 是包含结果的std::string。
【讨论】:
getline,所以会被解释为char \xff(宏EOF定义为(-1) )。如果字符串中不存在该字符,它似乎才有效。
继续使用operator>>,它将以空格分隔的部分提取其余部分。
【讨论】: