为什么用空格字符分割文件缓冲区不起作用?

时间:2018-09-21 09:37:24

标签: c++ string ifstream

给出以下代码:

#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()不能像我想的那样工作。

1 个答案:

答案 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的documentationget。我们正在处理签名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(),则会看到该程序将正常终止,但只有一个值。