следующий код не ведет себя так, как я ожидал бы. Пожалуйста, помогите мне понять, как это работает.алгоритм копирования с ifstream
#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'! –
Бесполезно беспокоиться о коде ввода-вывода, который не проверяет возвращаемые значения. Вы всегда должны * проверять возвращаемые значения операций ввода-вывода. –