给出以下代码:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
int main()
{
std::stringstream istrs("1 2 3 4 5 6");
std::vector<int> vec;
while(!istrs.eof())
{
int temp;
std::stringstream o;
istrs.get(*o.rdbuf(), ' ');
o >> temp;
vec.push_back(temp);
}
for(auto a : vec)
std::cout << a << " ";
std::cout << std::endl;
}
为什么循环永远不会退出?为什么o
仍未初始化?
我正在尝试将ifstream缓冲区拆分为较小的块以进行处理,但是我不知道为什么这个get()
不能像我想的那样工作。
答案 0 :(得分:0)
例如,您可以修改代码以使用getline
来解析字符串:
std::stringstream istrs("1 2 3 4 5 6");
std::vector<int> vec;
string temp;
while(getline(istrs,temp, ' '))
{
vec.push_back(stoi(temp));
}
for(auto a : vec)
std::cout << a << " ";
std::cout << std::endl;
我看不到需要另一个字符串流再进行转换。
要了解您提到的内容为何失败,请参考stringstream的documentation和get。我们正在处理签名type basic_istream& get( basic_streambuf& strbuf, char_type delim );
读取字符并将其插入到由控制的输出序列中 给定的basic_streambuf
您将其存储为int,尝试将temp
声明为string
,使用流运算符o >> temp
获取字符串,并使用stoi
转换为int 。您会发现转换将是您第一次成功完成,而不是其他转换,但是该程序将崩溃。原因是1之后,您没有提取任何字符并满足条件:
下一个可用的输入字符c等于delim,由 特性:: eq(c,delim)。无法提取此字符。
在这种情况下
如果未提取任何字符,请调用setstate(failbit)。
在while循环中,如果您设置!istrs.eof() && istrs.good()
,则会看到该程序将正常终止,但只有一个值。