使用ifstream复制算法

copy algorithm with ifstream

本文关键字:算法 复制 ifstream 使用      更新时间:2023-10-16

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

#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

通常,要读取整个文件,您需要读取直到读取失败。然后你就知道要么出了问题,要么你把它们都搞定了。无论哪种方式,你都不可能知道你已经到达了文件的末尾,直到你读不懂为止。由于第一个元素成功了,它必须再次尝试,以确定是否还有第二个元素。此的psudocode是

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

还要注意,这是读取整个值文件的"惯用"方式。如果您正在检查eoffailbad,那么您的代码可能是错误的。

也就是说,你的istream& operator>>(istream& is, user& s)函数很好。第二次调用它时,第一个getline将失败,将流设置为坏状态(eof),接下来的两个getline也将失败,它将返回流,并且一切都正常工作。请记住,由于读取失败,任何或所有这些变量都可能完全是无稽之谈。