einlesen einer Datei; Dateiende erkenne mit EOF()
-
Gehört dort vielleicht ein oder (||) hin?
Jop, er hat Recht. In deinem Fall überprüfst du ob das Dateiende erreicht ist UND bad () UND fail () eintritt. Es müsste natürlich so heisen:
while(!myFile.eof() || !myFile.bad() || !myFile.fail() )while(!myFile.eof () ODER !myFile.bad () ODER !myFile.fail ())

MfG mikey.
-
hm...nö
ich frage ja auf ungleich ab. solange alle 3 bits auf FALSE sind also. sobald ein bit (eof, fail oder bad) auf true geht wird beendet. scheint mir richtig zu sein, wobei es in diesem fall auch mit || geht.
-
hm...nö
Was ?!
scheint mir richtig zu sein, wobei es in diesem fall auch mit || geht.
Sorry, aber jetzt verstehe ich nichts mehr. Um was geht es dir letztendlich ? Hats geklappt, so wie du es wolltest ?
-
Hi,
also mit der Und-Verknüpfung ist das schon richtig, das Oder ist falsch. Denn wenn dann eof() wahr ist, heißt dass dann bei "oder" noch lange nicht, dass die schleife abgebrochen wird

Was sonst falsch sein könnte, weiß ich aber auch nicht

Beste Grüße
Jan
-
also mit der Und-Verknüpfung ist das schon richtig, das Oder ist falsch. Denn wenn dann eof() wahr ist, heißt dass dann bei "oder" noch lange nicht, dass die schleife abgebrochen wird
Ähm warum ? Wäre es eine UND Verknüpfung, dann müssten alle Werte true sein, damit sie abgebrochen wird. Und bei einer ODER Verknüpfung genügt nur ein true als Abbruchbedingung, oder sehe ich das falsch ?
Edit: Huch, ich hab mal das Beispiel durchkompiliert. Ich verstehe jetzt garnichts mehr -.- Mit den UND Verknüpfungen läuft die Schleife korrekt bis eof () und mit den ODER Verknüpfungen passiert irgendwie garnix, er bleibt in der Schleife stecken. Könnte mich da mal jemand aufklären ?!
Edit:
Denn wenn dann eof() wahr ist, heißt dass dann bei "oder" noch lange nicht, dass die schleife abgebrochen wird
Warum ?

-
mikey schrieb:
Könnte mich da mal jemand aufklären ?!
Schleifen sollen laufen und nicht abbrechen.
Deshalb formuliert man Laufbedingungen und nicht Abbruchbedingungen.
Klingt vielleicht blöde, aber auf das obige Beispiel übertragen heisst das :
// läuft wenn !myFile.eof() UND !myFile.bad() UND !myFile.fail() while(!myFile.eof() && !myFile.bad() && !myFile.fail() ) // läuft wenn !myFile.eof() ODER !myFile.bad() ODER !myFile.fail() while(!myFile.eof() || !myFile.bad() || !myFile.fail() )Alles klar ?

-
Deshalb formuliert man Laufbedingungen und nicht Abbruchbedingungen.
Stimmt so könnte man es auch sagen, ich habe mich falsch formuliert natürlich weis ich das
Aber in diesem Zusammenhang habe ich es tatsächlich völlig falsch verstanden, wie mir gerade an deinem Beispielcode bewusst gworden ist. Aber jetzt raffs ich , danke 
-
Warum machst du überhaupt eine so komplizierte Abbruchbedingung? Ein einfaches
while(myFile.good())oderwhile(!myFile.fail())reicht völlig aus (good() liefert true, wenn keines der Fehlerflags gesetzt ist; fail() fängt per Definition auch schwere Fehler und EOF ab).
-
CStoll schrieb:
Warum machst du überhaupt eine so komplizierte Abbruchbedingung? Ein einfaches
while(myFile.good())oderwhile(!myFile.fail())reicht völlig aus.... oder auch einfach 'while(myFile)'.

-
Konrad Rudolph schrieb:
CStoll schrieb:
Warum machst du überhaupt eine so komplizierte Abbruchbedingung? Ein einfaches
while(myFile.good())oderwhile(!myFile.fail())reicht völlig aus.... oder auch einfach 'while(myFile)'.

werd ich mal versuchen, der gedanke hat was.
allerding hab ich mein problem gelöst, auch wenn ich es noch nicht 100% verstehe.
da ich aus der datei lesen und das gelesene via socket versenden möchte, muss ich auch immer die information haben, wieviel ich gelesen hab(um genausovie zu versenden).
das wird beim dateiende interessant, da ich da nicht zwangsläufig in der vollen buffergröße noch daten übrig hab. deswegen lese exakt soviele bytes wie in der datei vorhanden sind, beim dateiende kann das weniger sein als in den buffer max. reinpasst.Mein Problem war(vermutlich) das ich durch das exakte lese der byte anzahl den fstream die chance genommen hab das EOF() festzustellen.
habe jezt einfach eine if-abfrage eingebaut, die prüft ob die restliche Anzahl zu lesender Bytes == 0 ist, wenn dies der Fall ist führe ich ein Pseudo-Read durch in der Länge 1. Jetzt stellt die fstream file EOF()fest und die schleife wird beendet.(ist zumindest meine these, bitte korrigieren falls ich falsch liege)
-
read() bricht mit dem Lesen ab, wenn es "auf halbem Weg" das Dateiende erreicht hat. Wieviele Bytes es tatsächlich gelesen hat, kannst du per gcount() ermitteln:
while(myFile) { myFile.read(buffer,buf_size); send(socket,buffer,myFile.gcount(),0); }(oder du verwendest readsome() - das gibt die Anzahl der gelesenen Zeichen zurück)
-
CStoll schrieb:
read() bricht mit dem Lesen ab, wenn es "auf halbem Weg" das Dateiende erreicht hat. Wieviele Bytes es tatsächlich gelesen hat, kannst du per gcount() ermitteln:
while(myFile) { myFile.read(buffer,buf_size); send(socket,buffer,myFile.gcount(),0); }(oder du verwendest readsome() - das gibt die Anzahl der gelesenen Zeichen zurück)
Das seht wesentlich eleganter aus als meins. thx
btw.
war deine vermutung mit dem EOF() richtig?