der folgende Code verhält sich nicht wie ich es erwarten würde. Bitte hilf mir zu verstehen, wie es funktioniert.kopieren Algorithmus mit 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;
}
Mein benutzerdefinierter Operator >> zweimal genannt, aber ich würde erwarten, dass es nur einmal aufgerufen werden, da der Inhalt:
John: vierzig: 21-5821-0
Woher wissen Sie, dass es zweimal aufgerufen wird? Check-in Debugger? Sie erhalten zwei Einträge im Vektor? Sind die letzten, sind beide Einträge gleich? –
+1, hatte in letzter Zeit das gleiche Problem ... Aus irgendeinem Grund verursachte der Iterator-Inkrement in dem 'copy'-Code das Lesen und nicht das Dereferenzieren, so dass ein Lesen zu viele durchgeführt wird. Das heißt, Ihr 'Operator >>' muss den Status nach den ersten beiden 'getline'-Operationen überprüfen! –
Es macht keinen Sinn, sich Gedanken über den E/A-Code zu machen, der die Rückgabewerte nicht überprüft. Sie müssen * immer * die Rückgabewerte von E/A-Operationen überprüfen. –