6

以下代码的行为不像我预期的那样。请帮助我了解它是如何工作的。

#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;
}

我的自定义 operator>> 被调用了两次,但我希望它只被调用一次,因为内容是:

约翰:四十:21-5821-0

4

1 回答 1

3

通常,要读入整个文件,您会一直读取直到读取失败。然后你知道要么出了问题,要么你得到了所有。无论哪种方式,在您无法阅读之前,您都不知道您已到达文件末尾。既然第一个成功了,就必须再试第二次,看看是否还有第二个元素。这个伪代码是

while(in_stream >> object) {
   myvector.push_back(object);
}

另请注意,这是读取整个值文件的“惯用”方式。如果您正在检查eoffailbad,则您的代码可能是错误的。

也就是说,你的istream& operator>>(istream& is, user& s)功能很好。第二次调用,第一次getline会失败,将流设置为错误状态(eof),接下来getline的两次也会失败,它会返回流,一切正常。请记住,任何或所有这些变量都可能完全是胡说八道,因为读取失败。

于 2012-03-30T23:39:57.770 回答