Ansi C - Datei auslesen und nur ein Teil ausgeben..

RedWing hat gesagt.:
//offtopic

Was spricht dann gegen die Verwendung der Methode good() ?
Nix. :)

Aber ich finde das komplizierter:
Code:
while (file.good()) {
  file >> int_var;
  if (file.good ()) {
      // nu kann man int_var verwenden. 
  }
}

Den Zustand des Streams zu prüfen indem man den Stream in einen boolschen Wert überführt finde ich eigentlich ziemlich elegant - da kann man die Ein-/Ausgabe und Fehlerprüfung gleich in einem Abwasch machen.
 
Aber ich finde das komplizierter:
Kompilzierter nicht aber aufwendiger da hast du recht.
Den Zustand des Streams zu prüfen indem man den Stream in einen boolschen Wert überführt finde ich eigentlich ziemlich elegant - da kann man die Ein-/Ausgabe und Fehlerprüfung gleich in einem Abwasch machen.
Elegant schon aber lesbar is sie weniger...
Wenn man good() verwendet kann man schon allein an der Syntax die Semantik erkennen, bei der
andren Methode muss ich erst in der Referenz oder ähnlichem nachschauen.
Aber ehrlich gesagt würd ich auch die Methode mit dem operator! vorziehen :)

Gruß

RedWing
 
In dem Link von dir klingt es so als würde der Operator>> gleich einen boolschen Wert liefern,
das stimmt aber nicht, er besitzt als Rückgabewert immer einen istream durch den implizit der
Operator ! aufgerufen wird, deswegen ist die Methode zwar eleganter aber auch verwirrender...

Gruß

RedWIng
 
RedWing hat gesagt.:
In dem Link von dir klingt es so als würde der Operator>> gleich einen boolschen Wert liefern,
Ja, stimmt. Das klingt da tatsächlich so. Hatte ich aber nur ganz schnell bei Google rausgekramt.

RedWing hat gesagt.:
das stimmt aber nicht, er besitzt als Rückgabewert immer einen istream durch den implizit der
Operator ! aufgerufen wird, deswegen ist die Methode zwar eleganter aber auch verwirrender...
Also der Rückgabewert ist eine Referenz auf den Stream und auf diese Referenz wird der operator void*() angewendet, der gibt dann 0 zurück sollte der Stream in einen Fehlerzustand gegangen sein, und einen anderen Wert sonst (normal den this Pointer).

Ich verstehe nicht wie du jetzt auf den operator! () kommst?

Man könnte die Eingabeschleife allerdings auch so machen
Code:
while ( (cin >> int_val).good ()) {
 //...
}
Wärst du denn damit einverstanden?

RedWing hat gesagt.:
Aber ehrlich gesagt würd ich auch die Methode mit dem operator! vorziehen
Ui, das verwirrt mich jetzt etwas. Welchen operator! meinst du denn jetzt?
 
deepthroat hat gesagt.:
Ich verstehe nicht wie du jetzt auf den operator! () kommst?

Das meinte ich mit verwirrend. Ich habe nirgend wo etwas gesehen was dementsprechen würde:
Code:
ifstream if;
if (if){
   //usw
}

Deswegen hab ich angenommen das implizit sowas draus gemacht wird:
Code:
ifstream if;
if (!!if){
   //usw
}
Damit lag ich aber wohl falsch...
Man könnte die Eingabeschleife allerdings auch so machen
Code:
while ( (cin >> int_val).good ()) {
 //...
}
Wärst du denn damit einverstanden?
Das würde mir gefallen...

Gruß

RedWing
 
Ah, OK. Das mit dem operator void* () ist ein notwendiger Trick. Man hätte ja intuitiv einfach den operator bool () definieren können, aber da gibt es ein Problem: automatisch könnte der Stream in einen int konvertiert werden und dann bekommt der Operator << eine ganz andere Bedeutung. Für void* gibt es allerdings nur eine legale Operation, nämlich den operator ==.

Außerdem hab ich gerade noch was gefunden, was deutlich für die Verwendung des normalen C++ Idioms für Eingabe von Streams spricht.
http://www.horstmann.com/cpp/pitfalls.html hat gesagt.:
Example:
Code:
while (cin.good())
{  int x;
   cin >> x;
   if (cin.good()) a.push_back(x);
}
Pitfall:
Code:
cin >> x; // <--- may succeed and then encounter EOF
if (cin.good()) a.push_back(x);
This code may miss the last element in the input file, if it is directly followed by EOF.

Remedy: Use fail():
Code:
while (!cin.fail())
{  int x;
   cin >> x;
   if (!cin.fail()) a.push_back(x);
}

Code:
if (cin)
ist äquivalent zu
Code:
if (!cin.fail())
und umgekehrt ist
Code:
if (cin.good ())
nicht äquivalent zu den beiden ersten Varianten.
 
Ok wie man wieder sieht ist nichts trivial :)

Wie wäre es wenn wir uns auf:

Code:
while( !((cin >> input).fail()) )
{  
      //mach was mit input
}

einigen? Denn das sagt meiner Meinung nach aus was passiert...

Gruß

RedWing
 
Zurück