Datei einlesen in C++

Allerdings unterschlägt while(datei >> i) den letzten Eintrag...
Sicher, es gibt elegantere Lösungen als den zusätzlichen Funktionsaufruf in meinem Beispiel... nur ob die dann auch einfacher sind? :p
Es geht nicht um die Einfachheit (wobei das noch dazukommt). Dein Code ist einfach falsch und funktioniert nicht [verlässlich].

Und du irrst dich: mein Code unterschlägt nicht den letzten Eintrag. Im Gegenteil: bei deinem Code besteht diese Möglichkeit. (\edit: evlt. kommst du auch zu dieser Fehleinschätzung, da dein Code die letzte Zeile doppelt verarbeitet?)

Gruß
 
Zuletzt bearbeitet:
Ich verwende meist C und dachte einfach an die Überprüfung des Rückgabewertes von fscanf auf EOF.
Wobei ich ja auch hätte Nachsehen können..,
- was der Rightshift-Operator bei ifstream-Objekten wann zurück gibt,
- dabei feststellen, dass laut der Doku immer *this zurückgegeben wird und
- mich dann fragen, ob da vielleicht auch mal NULL 'rauskommen kann und die Doku einfach unvollständig ist oder
- ob ein entsprechender Operator auf istream-Pointer irgenwdo definiert wird.
Da ich das jetzt nachgeholt habe und nun vor der Frage stehe, will ich genau diese mal stellen - bevor ich mir die Mühe mache es heraus zu finden:
Warum funktioniert while(datei >> i) so vorbildlich?
 
Ich verwende meist C und dachte einfach an die Überprüfung des Rückgabewertes von fscanf auf EOF.
Aha. Aber du rufst ja auch nicht vor der Eingabe feof() auf, denn dann weißt du auch wieder nicht ob das folgende Einlesen klappen wird. Du führst doch auch eine Einleseoperation durch und prüfst dann ob diese erfolgreich war. Und auf EOF prüft man auch da in den seltensten Fällen.
Wobei ich ja auch hätte Nachsehen können..,
- was der Rightshift-Operator bei ifstream-Objekten wann zurück gibt,
- dabei feststellen, dass laut der Doku immer *this zurückgegeben wird und
- mich dann fragen, ob da vielleicht auch mal NULL 'rauskommen kann und die Doku einfach unvollständig ist oder
- ob ein entsprechender Operator auf istream-Pointer irgenwdo definiert wird.
Da ich das jetzt nachgeholt habe und nun vor der Frage stehe, will ich genau diese mal stellen - bevor ich mir die Mühe mache es heraus zu finden:
Warum funktioniert while(datei >> i) so vorbildlich?
Weil ein operator void*() auf den Streams definiert ist, der einen Nullzeigerwert zurückgibt falls eof(), bad() oder fail() true zurückliefern, der Stream also in einem der drei Fehlerzustände ist. Ein void* kann in einen boolschen Wert konvertiert werden.

Gruß
 
Aha. Aber du rufst ja auch nicht vor der Eingabe feof() auf, denn dann weißt du auch wieder nicht ob das folgende Einlesen klappen wird. Du führst doch auch eine Einleseoperation durch und prüfst dann ob diese erfolgreich war. Und auf EOF prüft man auch da in den seltensten Fällen.
Völlig richtig. Jetzt dürfte es allerdings nicht allzu schwer sein nachzuvollziehen, warum beim Tippen des Beispiels der Aufruf der eof() Methode für mich sinnvoll erschien...

Weil ein operator void*() auf den Streams definiert ist, der einen Nullzeigerwert zurückgibt falls eof(), bad() oder fail() true zurückliefern, der Stream also in einem der drei Fehlerzustände ist. Ein void* kann in einen boolschen Wert konvertiert werden.
Jetzt, da ich dank Dir - mal wieder - ein Bisschen schlauer bin, wirst Du diesen Unsinn nicht mehr sehen - zumindest nicht von mir. :p
 
Zurück