为什么按 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()
,您会看到程序将正常终止,但您将只有一个值。
给定以下代码:
#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()
,您会看到程序将正常终止,但您将只有一个值。