C++ stringstream 和 fail vs 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:30am 当地时间所以这可能与它有关!)
使用 gcc 版本 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04)
这是常见 incorrect use of eof() 错误的一个伪装版本。
循环应该是:
while ( input >> i )
v1.push_back(i);
在您的实际代码中,即使在读取失败后您仍然push_back(i)
。
在带有 eof()
的版本中,它可能会或可能不会在读取以前的值时实际设置 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:30am 当地时间所以这可能与它有关!)
使用 gcc 版本 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04)
这是常见 incorrect use of eof() 错误的一个伪装版本。
循环应该是:
while ( input >> i )
v1.push_back(i);
在您的实际代码中,即使在读取失败后您仍然push_back(i)
。
在带有 eof()
的版本中,它可能会或可能不会在读取以前的值时实际设置 eof
标志;你不能依赖你所观察到的。