2016-03-29 4 views
0

Für dieses Programm arbeite ich mit Stacks und Queues. Ich habe eine Datei für die Verarbeitung zwischen Nummern eingerichtet, die entweder in den Stapel oder in die Warteschlange gehören. Meine Datei ist in dieser einfachen Reihenfolge eingerichtet. Es hat Zahlen und den Buchstaben n auf jeweils einer Zeile.C++ Warum funktioniert eine .ignore() - Funktion nicht richtig?

12 
44 
23 
55 
n 
77 
22 
14 
67 
88 

Zahlen gehen auf den Stapel, wenn die Zahl größer als 0 und kleiner als 50. Eine Zahl in die Warteschlange geht, wenn die Zahl von mehr als 50 und weniger als 100. Wenn die Daten nicht eine Zahl ist, Ich möchte es verwerfen und zum nächsten Lesevorgang gehen. Hier bekomme ich einige Probleme.

Hier ist die while-Schleife ich dies verarbeiten bin mit:

while (infile) 
{ 
    infile >> number; //takes in a number 
    if (0 < number && number < 50) 
    { 
     PushToStack(number); // pushed to stack 
    } 
    else if (50 < number && number < 100) 
    { 
     PushToQueue(number); // pushes to queue 
    } 
    else 
    { 
     // discard and move to next read 
     infile.ignore(1, '\n'); 
    } 
} 

ich getestet habe diesen Code ein paar Mal, und ich habe die folgende Ausgabe erzeugt:

Pushed To Stack: 12 
Pushed To Stack: 44 
Pushed To Stack: 23 
Pushed To Queue: 55 
Pushed To Queue: 55 

Sobald der Buchstabe n ist im Satz erreicht, liest die anderen Zahlen nicht weiter und wiederholt auch die letzte Ziffer. Ich dachte infile.ignore (1, '\ n') würde zur nächsten Zeile springen. Ich habe cplusplus.com verwendet, um zu verstehen, wie .ignore funktioniert, was besagt, dass .ignore (1, '\ n') eine Zeile überspringen würde. Also verwende ich die Ignore-Funktion falsch, oder gibt es einen besseren Weg, ohne .ignore zu verwenden, um die schlechten Daten zu überspringen und weiter Zahlen aus der Datei einzulesen?

Antwort

0

infile.ignore(1, '\n') ignoriert höchstens ein Zeichen.

versuchen Sie stattdessen:

infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

dies so viele Zeichen ignoriert wie die Architektur zählen kann, wird aber ignoriert stoppen, nachdem eine neue Zeile oder das Ende der Datei zu stoßen.

std::numeric_limits definiert in <limits>

+0

leider funktioniert das nicht either..I sogar eine cout-Anweisung enthalten, um zu sehen, ob es funktionieren würde. Noch keine guten Ergebnisse. Ich bekomme immer noch die gleiche Ausgabe. Sind Sie sicher, dass Sie in Ihrer Antwort nichts anderes verpassen? – Nathan

+0

Ah ja. Operator >> konsumiert nicht die nachfolgende Newline, sondern nur die führende. Dies ist nur wichtig, wenn Sie eine neue Zeile und eine weitere vollständige Zeile ignorieren müssen. Du brauchst 2 Aufrufe um zu ignorieren() oder um deine Zahlen als Strings mit std :: getline() gefolgt von einem Aufruf von stoi() zu konsumieren –