einlesen einer Datei; Dateiende erkenne mit EOF()



  • Hallo,

    ich lese eine datei ein und versende diese über einen socket. ich lese solange bis EOF() bzw. ein Fehler auftritt(BAD(), FAIL()). Allerdings läuft die Routine dann in einem LOOP. scheinbar tritt nie EOF ein.

    Frage, warum ist das so?

    while(!myFile.eof() && !myFile.bad() && !myFile.fail() )
    			{
    				/*Exakte Anzahl an Bytes senden und nicht volle Buffergröße */
    				if(restToBeSend > SND_RCV_BUFFER_SIZE)
    				{
    					myFile.read(sendBuffer, usualSizeToSend);
    					totalSend += send(sendSocket, sendBuffer, SND_RCV_BUFFER_SIZE, 0);
    				}
    				else if(restToBeSend > 0)
    				{
    					myFile.read(sendBuffer, restToBeSend);
    					totalSend += send(sendSocket, sendBuffer, restToBeSend, 0);
    				}
    
    				std::cout<<sendBuffer<<"\n <BREAK> \n"<<std::endl;
    
    				restToBeSend = sizeOfFile - totalSend;
    			}
    

    Könnte es daran liegen, dass ich nur solange lese bis restToBeSend = 0 ist und damit verhindere das mein fstream File das EOF() Flag auf true setzt?



  • Bin noch kein C++ Programmierer und kapiere nicht den gesamten Quelltext.
    Aber deine while-Schleife wird nur dann beendet, wenn EOF erreicht ist und ein Fehler bad() und und ein Fehler fail() auftritt.
    Gehört dort vielleicht ein oder (||) hin?



  • 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()) oder while(!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()) oder while(!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()) oder while(!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?


Anmelden zum Antworten