2017-02-03 3 views
0

Ich brauche etwas Hilfe mit einem Code.Ifstream in C++

ich diese Informationen in meine c nehmen müssen ++ Code aus einer anderen Datei, die letzte nur so:

Human:3137161264 46

Dies ist, was ich für sie schrieb, es nimmt das Wort „Mensch“ richtig, aber dann dauert es Zufallszahlen, nicht die auf die Datei geschrieben, die ich gerade geschrieben:

struct TSpecie { 
string id; 
int sizeGen; 
int numCs; }; 

__

TSpecie readFile(string file){ 
TSpecie a; 
ifstream in(file); 
if (in){ 
    getline(in,a.id,':'); 
    in >> a.sizeGen; 
    in >> a.numCs; 
} 
else 
    cout << "File not found"; 
return a; } 

Hoffe, dass Sie es und vielen Dank für Ihre Hilfe

+0

'3137161264' verursacht Integer-Überlauf zu * Undefined Behaviour * –

+0

Sie können Dinge tun wie' if (! (In >> a.sizeGen)) {std :: cout << "fehlgeschlagen beim Lesen sizeGen \ n";} 'um zu überprüfen, ob das Lesen der Nummer erfolgreich war. – nwp

Antwort

2

3137161264 verursacht Integer-Überlauf führt zu undefinierten Verhalten lösen können.

Also unsigned int sizeGen wäre genug für diesen Fall, aber betrachten long long (unsigned) int sizeGen auch.

Edit 1: Wie bereits auf Ihre Frage in den Kommentaren von @nwp, können Sie auch Ihren Stream überprüfen, ob ein Fehler aufgetreten ist:

//read something and then 

if (!in) { 
    // error occured during last reading 
} 
1

immer Test, ob eine Eingabe erfolgreich war nach Lesen aus dem Stream:

if (std::getline(in, a.id, ':') >> a.sizeGen >> a.NumCs) { 
    // ... 
} 

Höchstwahrscheinlich wahrscheinlich~~POS=HEADCOMP wird der Eingang gerade gescheitert. Zum Beispiel kann die erste Nummer wahrscheinlich nicht erfolgreich gelesen werden. Man beachte auch, dass std::getline() eine unformatierte Eingabefunktion ist, d. H. Führende Leerzeichen werden nicht übersprungen. Zum Beispiel ist der Zeilenumbruch nach der letzten gelesenen Nummer immer noch im Stream (zumindest, da Ihre Verwendung von std::getline() auf einem Doppelpunkt endet, wird nur eine ungerade ID erstellt).