flu*_*mpb 6 c++ iterator istream-iterator ifstream stl-algorithm
以下代码的行为与我的预期不符.请帮我理解它是如何工作的.
#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;
}
Run Code Online (Sandbox Code Playgroud)
我的自定义运算符>>被调用两次,但我希望它只被调用一次因为内容是:
约翰:40:21-5821-0
一般来说,要读取整个文件,您需要读取直到读取失败。然后你就知道要么出了问题,要么你就得到了所有这些。无论哪种方式,除非无法读取,否则您无法知道已到达文件末尾。由于第一次成功,它必须尝试第二次,以查明是否存在第二个元素。其伪代码是
while(in_stream >> object) {
myvector.push_back(object);
}
Run Code Online (Sandbox Code Playgroud)
另请注意,这是读取整个值文件的“惯用”方法。如果您正在检查eof、fail、 或bad,则您的代码可能是错误的。
也就是说,你的istream& operator>>(istream& is, user& s)功能很好。第二次调用时,第一次getline将失败,将流设置为错误状态(eof),接下来的两次getline也将失败,并且它将返回流,并且一切正常。请记住,任何或所有这些变量可能完全没有意义,因为读取失败。