il seguente codice non si comporta come mi aspetterei. Per favore aiutami a capire come funziona.con 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;
}
Il mio operatore personalizzato >> è chiamato due volte, ma mi sarei aspettato di essere chiamato solo una volta perché i contenuti sono:
John: quaranta: 21-5821-0
Come fai a sapere che si chiama due volte? Controllato nel debugger? Hai due voci nel vettore? Se l'ultimo, entrambe le voci sono le stesse? –
+1, ha avuto lo stesso problema di recente ... per qualche ragione, l'incremento iteratore nel codice 'copia' stava causando la lettura, piuttosto che il dereferenziamento, quindi esegue una lettura di troppo. Detto questo, l'operatore '' deve controllare lo stato dopo le prime due operazioni 'getline'! –
È inutile preoccuparsi del codice I/O che non controlla i valori di ritorno. È necessario * sempre * controllare i valori di ritorno delle operazioni di I/O. –