【发布时间】:2012-03-30 22:46:32
【问题描述】:
以下代码的行为与我预期的不同。请帮助我了解它是如何工作的。
#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
struct user
{
string name;
string age;
string id;
};
istream& operator>>(istream& is, user& s)
{
getline(is, s.name, ':');
getline(is, s.age, ':');
getline(is, s.id);
return is;
}
int main(int argc, char* argv[])
{
ifstream file("file.txt");
vector<user> vec;
copy(istream_iterator<user>(file), istream_iterator<user>(), back_inserter(vec));
return 0;
}
我的自定义操作符>>被调用了两次,但我希望它只被调用一次,因为内容是:
约翰:四十:21-5821-0
【问题讨论】:
-
你怎么知道它被调用了两次?检查调试器?你在向量中有两个条目?如果是最后一个,两个条目是否相同?
-
+1,最近遇到了同样的问题……由于某种原因,
copy代码中的迭代器增量导致了读取,而不是取消引用,因此它执行了一次读取太多。也就是说,您的operator >>需要检查前两次getline操作后的状态! -
担心不检查返回值的 I/O 代码是没有意义的。您必须始终检查 I/O 操作的返回值。
-
这对我来说似乎很奇怪。 vec 的大小为 1,但 operator>> 被调用了两次。感谢 cmets。
-
@kisplit:第二次调用它是为了让它知道它到达了文件的末尾。它怎么知道它读取了整个文件,除非它读取直到读取失败?第二次失败,所以它知道没有更多数据了。
标签: c++ iterator ifstream stl-algorithm istream-iterator