C++字符串流和失败与eof
C++ stringstream and fail vs eof
想知道这里发生了什么。我试图通过gdb来实现这一点,但似乎无法获得libstdc++的调试版本/代码,所以希望了解他们流的人能提供帮助?在下面的代码中,关键位是while循环:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
int main ()
{
string s;
getline(cin, s);
stringstream input(s);
vector<int> v1;
int i;
while (!input.fail())
{
input >> i;
v1.push_back(i);
}
for_each(v1.begin(), v1.end(), printer);
return 0;
}
当我运行这个并提供一个数字时,它似乎将该数字添加到向量中两次。如果我将while循环的条件更改为eof()
(而不是fail()
),那么一切都会如我所期望的那样。
因此,假设提取operator>>
应该从流中提取值,那么连续调用怎么可能不断产生结果呢?
我猜我想得不太对(现在是当地时间凌晨2:30,所以这可能与此有关!)
使用gcc 4.9.2版本(Ubuntu 4.9.2-0ubuntu1~12.04)
这是eof()错误的常见错误使用的一个薄薄的伪装版本。
循环应为:
while ( input >> i )
v1.push_back(i);
在实际的代码中,即使在读取失败之后,您仍然是push_back(i)
。
在具有eof()
的版本中,它在读取先前值时可能实际设置eof
标志,也可能不实际设置;你不能依赖你所观察到的。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 如何确定我已使用非编码文件到达 EOF?
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- EOF 位:读取失败之前或之后
- fgetwc EOF 循环测试失败,但 65535 正常
- C++字符串流和失败与eof