Ich bin ein Informatikstudent, ein so wenig Erfahrung mit der C++ - Sprache (wenn es mein erstes Semester mit dieser Sprache ist) oder Codierung für diese Angelegenheit.Wie genau funktioniert der Extrakt >> Operator in C++
ich gegeben wurde, einen Auftrag ganze Zahlen aus einer Textdatei in der einfachen Form zu lesen:
19 3 -2 9 14 4
5 -9 -10 3
.
.
.
Dieser schickte mich auf einer Reise I/O-Betreiber besser zu verstehen, da ich bin verpflichtet, zu bestimmte dinge mit diesem stream (duh.)
Ich habe überall gesucht und konnte keine einfache Erklärung finden, wie der Extrakt >> operator intern funktioniert. Lassen Sie mich meine Frage klären:
Ich weiß, dass der Extraktor >> Operator ein fortfahren Element extrahiert, bis es Raum, Tab oder Newline trifft. Ich versuche herauszufinden, wo der Zeiger (?) Oder der Leseort (?) NACH dem Extrahieren eines Elements sein würde. Wird es auf dem letzten Char des Elements gerade entfernt oder wurde es entfernt und damit weg? Wird es auf dem Leerzeichen/Tab/'\ n' Zeichen selbst sein? Vielleicht der Anfang des nächsten zu extrahierenden Elements?
Ich hoffe, ich war klar genug. Mir fehlt der passende Jargon, um mein Problem klarer zu beschreiben.
Hier ist, warum ich das wissen müssen: (falls jemand fragt ...) Eine der Anforderungen ist es, alle Zahlen in jeder Zeile getrennt zu summieren. Ich habe eine Schleife erstellt, um alle Ganzzahlen eins nach dem anderen zu extrahieren, bis sie das Ende der Datei erreicht. Ich habe jedoch bald gelernt, dass der Operator extract >> Leerzeichen/Tab/Newline ignoriert. Was ich versuchen möchte ist, ein Element zu extrahieren und dann mit inputFile.get() das Leerzeichen/Tab/Newline zu erhalten. Wenn es ein Newline ist, dann tu was ich tun soll. Dies funktioniert nur, wenn der Streamzeiger in einer guten Position ist, um das Leerzeichen/Tab/Newline nach der letzten Extraktion >> zu extrahieren.
In my previous question, habe ich versucht, es zu lösen getline() verwendet und eine SSTRING.
LÖSUNG:
Aus Gründen meine konkrete Frage zu beantworten, wie Operator >> funktioniert, ich hatte Ben Voigt Antwort als die beste zu akzeptieren. Ich habe die anderen hier vorgeschlagenen Lösungen verwendet (mit einem sstring für jede Zeile) und sie haben funktioniert! (Sie können es in meiner vorherigen Frage der Link sehen) Allerdings habe ich eine andere Lösung mit Ben Antwort implementiert und es funktionierte auch:
.
.
.
if(readFile.is_open()) {
while (readFile >> newInput) {
char isNewLine = readFile.get(); //get() the next char after extraction
if(isNewLine == '\n') //This is just a test!
cout << isNewLine; //If it's a newline, feed a newline.
else
cout << "X" << isNewLine; //Else, show X & feed a space or tab
lineSum += newInput;
allSum += newInput;
intCounter++;
minInt = min(minInt, newInput);
maxInt = max(maxInt, newInput);
if(isNewLine == '\n') {
lineCounter++;
statFile << "The sum of line " << lineCounter
<< " is: " << lineSum << endl;
lineSum = 0;
}
}
.
.
.
Ohne Bezug auf meine numerischen Werte, die Form ist richtig! Beide Räume und ‚\ n die wurden gefangen:
Danke Ben Voigt :)
Dennoch ist diese Lösung sehr Format abhängig und ist sehr zerbrechlich. Wenn eine der Zeilen etwas anderes vor '\ n' hat (wie Leerzeichen oder Tabulatorzeichen), wird der Zeilenumbruch vom Code nicht erkannt. Daher ist die andere Lösung, die getline() und sstrings verwendet, viel zuverlässiger.
scheint, dass Sie ganze Zeilen lesen möchten, und dann sie selbst analysieren. – Deduplicator
Sie fragen meistens nach irrelevanten Implementierungsdetails. 'operator >>' extrahiert einen Wert und bringt den Stream weiter. Wenn Sie ein komplizierteres Parsing wünschen, verwenden Sie einen echten Parser. –
Hast du versucht, 'get' zu nennen und zu prüfen, welchen Charakter du bekommst? –