2016-07-17 5 views
-3

mein Problem ist:
ifstream gibt mir nur 16 Elementeifstream gibt mir nur 16 Elemente

Hallo, In meinem C++ Code, den ich mehrere Klassen haben. Sie sind:
-Daten (Fügen Sie einige Zahlen)
-Towns (Fügen Sie mindestens 2 Daten -Objekte (in einem Vektor) und die Staatsname)
-County (Manage die Stadt -Objekte)

Das Programm sollte das Objekt Town mit den Daten einer bestimmten Datei füllen. Der Code sieht wie folgt aus:

COUNTRY.CPP:

Country::Country(string file) { 
    ifstream x(file); 

    Town t; 
    while (x.good()) { 
    x >> t; 
    this->towns.push_back(t); 
    } 
} 

Um tiefer zu bekommen -> die „>> t“ sieht wie folgt aus:

TOWN.CPP :

istream& operator>>(std::istream& is, Town& d) { 
    is >> d.state>> d.town; 
    Data a, b; 
    a.SetYear(2011); 
    is >> a >> b; 

    // Some other code was here - but i think it's not relevant 

return is; 
} 

, tiefer zu bekommen -> die „>> a“ sieht wie folgt aus:

DATA.CPP:

istream& operator>>(std::istream& is, Data& d) { 
    return is >> d.total >> d.male >> d.female; 
} 

Wie Sie gesehen haben - die Städte in einer Datei sind. Die Struktur in der Datei wiederholen immer und immer wieder (insgesamt: 11.292) und sieht wie folgt aus:

SOURCE (Beispiel)

Baden-Württemberg 
Kirchheim am Neckar 
5225 
2588 
2637 
5205 
2608 
2597 
Baden-Württemberg 
Kornwestheim 
31053 
15167 
15886 
31539 
15502 
16037 

1. Zeile: Staatliche
2. Zeile: Stadt
3.-5 und 6. bis 8. Zeile: Daten
REPEAT

soo ... Und aus irgendeinem Grunde nur die ifstream gibt mir 16 Elemente (16 Tow ns). Hmmm ....

+1

'Kirchheim am Neckar' - Der' std :: string :: operator >> 'liest nur bis zum ersten Leerzeichen.Vielleicht erhalten Sie deshalb nicht alle Ihre Daten, oder zumindest scheint dies ein Fehler beim Einlesen der Eingaben zu sein. Alles, was Sie bekommen würden, ist "Kirchheim" und nicht "Kirchheim am Neckar". – PaulMcKenzie

Antwort

2

Lesen Sie eine std::string mit dem Shift-Operator lesen Sie nur ein Wort. Standardmäßig sind Wörter durch Leerzeichen begrenzt. Als Ergebnis wird die Zeichenfolge Kirchheim am Neckar nicht vollständig gelesen, sondern nur Kirchheim wird gelesen. Wenn versucht wird, am als Ganzzahl zu lesen, geht der Stream in den Fehlermodus und weigert sich, etwas zu lesen, bis seine Flags clear() ed sind.

Sie möchten wahrscheinlich die Stadt und möglicherweise den Staat lesen, indem Sie die vollständige Zeile lesen. Verwenden Sie hierzu std::getline(stream, str). Auch immer Test Erfolg Ihrer Leseoperation nach der Leseversuch. Die idiomatische Art, Streams zu verwenden, ist

while (x >> t) { 
    ... 
}