Ich möchte einige Zahlen von der Standardeingabe lesen, sie verarbeiten und dann die nächste Reihe von Zahlen lesen.Lesen von std :: cin mehrmals - unterschiedliches Verhalten unter Linux und Mac OS X
Ich kam mit der Lösung zum Lesen der EOF
Zeichen in einem char
und löschen Sie die Eofbit, Failbit und Badbit. Der folgende Code funktioniert auf Ubuntu 14.04 mit GCC 4.9.2:
#include <iostream>
#include <vector>
int main() {
std::vector<double> a;
std::vector<double>::iterator it;
double x;
while(std::cin >> x) {
a.push_back(x);
}
std::cout << "First bunch of numbers:" << std::endl;
for (it = a.begin(); it != a.end(); ++it) {
std::cout << *it << std::endl;
}
// get crap out of buffer
char s;
std::cin >> s;
std::cin.clear();
// go for it again
while (std::cin >> x) {
a.push_back(x);
}
std::cout << "All the numbers:" << std::endl;
for (it = a.begin(); it != a.end(); ++it) {
std::cout << *it << std::endl;
}
return 0;
}
Also, auf Ubuntu kann ich 1<Return>2<Return>^D
geben, eine Ausgabe zu erhalten, geben Sie 3<Return>4<Return>^D
, mehr ausgegeben und das Programm beendet erhalten.
Unter Mac OS 10.10 jedoch die gleichen GCC-Version verwenden, das Programm wird die zweite Runde der Eingabe nicht akzeptieren sondern gibt die erste Folge von Zahlen zweimal nach ^D
das ersten Mal zu treffen.
- Warum gibt es inkonsistentes Verhalten? Kann man das umgehen?
- Was wäre die idiomatische Art und Weise, Eingabe zweimal zu akzeptieren?
- In meinem Anwendungsfall kann die erste Gruppe von Zahlen möglicherweise aus einer Datei oder Pipeline gelesen werden. Wie kann ich auch in diesem Szenario interaktiv nach zusätzlichen Eingaben fragen?
Vielleicht versuchen 'std :: cin.clear Aufruf()', bevor Sie es nach dem Senden 'EOF' zum ersten Mal? – Galik
Dies ist Konsolenverhalten, nicht C++ - Code. In MacOS schließt es wahrscheinlich den Eingabestrom nach dem Senden von EOF [wie in Windows] (http://stackoverflow.com/questions/10147996/resume-reading-from-iostreamcin-after-ctrlz-eof-ignore-doesnt-work?rq) = 1) –