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?
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
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 –