为什么按 space 个字符拆分文件缓冲区不起作用?

Why splitting a filebuffer by space character doesn't work?

给定以下代码:

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

您可以修改代码以使用 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;

我认为不需要另一个字符串流然后进行转换。

要了解您提到的失败原因,请参阅 documentation of stringstream and for get。我们正在处理签名的第 6 次重载 type basic_istream& get( basic_streambuf& strbuf, char_type delim );

reads characters and inserts them to the output sequence controlled by the given basic_streambuf

您将其存储为 int,尝试将 temp 声明为 string,使用流运算符 o >> temp 获取字符串,并使用 [=16] 转换为 int =].你会发现你第一次成功的转换而不是其他的,而是程序会崩溃。原因是在1之后,你没有提取任何字符,满足条件:

the next available input character c equals delim, as determined by Traits::eq(c, delim). This character is not extracted.

在这种情况下

If no characters were extracted, calls setstate(failbit).

如果您在 while 循环中设置 !istrs.eof() && istrs.good(),您会看到程序将正常终止,但您将只有一个值。