Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
fgets und EOF
Wenn direkt vor EOF ein \n oder gar nichts steht, gibt fgets ja NULL zurück.
Wenn jedoch direkt vor dem EOF sich ein char befindet (Bsp. Ctrl+D in der Konsole ohne davor Enter gedrückt zu haben), wie soll das EOF da entdeckt werden?
Problem gelöst
[m]fgets(3)[/m] gibt [m]NULL[/m] zurück, sobald EOF (End-Of-File) erreicht wird. Das [m]„\n“[/m] wurde vorher schon normal gelesen. EOF ist kein Zeichen, sondern sagt einfach nur, dass die Datei zu Ende ist.
Dann musst du einfach nur nochmal [m]Ctrl-D[/m] drücken. Erst dann schließt der Terminal-Emulator die Eingabe.
Edit: Wenn du eine Lösung gefunden hast, teil sie bitte auch den anderen mit, damit sie auch was davon haben.
Verstehe ich dich richtig dass EOF somit immer hinter einen \n steht?
Ansonsten wäre mein Ansatz gewesen, dass eine von fgets eingelesene Zeile, in der weniger als size reguläre chars sind (d.h. \0 befindet sich nicht am ende des Buffers), mit \n oder EOF beendet worden ist. \n lässt sich ja einfach überprüfen, ansonsten muss es dann halt ein EOF gewesen sei.
Ein Terminal-Emulator will zweimal Ctrl-D um ein EOF zu erzeugen vor dem kein \n steht. Nach deinem \n reicht dem Terminalemulator ein Ctrl-D. Das ist eine in dem Zusammenhang leicht verwirrende Funktion diverser Terminalemulatoren.
Wenn man die Eingabe nicht manuell erzeugt sondern aus einer Datei holt (./foo < datei) kanns auch passieren dass am Ende der Datei, bevor EOF kommt ein \n steht oder nicht. Viele Editoren machen automatisch ein \n ans Ende jeder Datei, aber das muss nicht so sein.
Danke für die tolle Erklärung! Ich werd also dementsprechend meine EOF-Überprüfung in Post #4 einbauen müssen.
Ich weiß nicht genau worauf du raus willst. Es war dann ein EOF, wenn [m]fgets(3)[/m] [m]NULL[/m] zurückliefert (und [m]ferror(3)[/m] nicht wahr ist). Sonst kannst du nur feststellen, ob eine Zeile zuende war (endet mit [m]„\n“[/m]) oder nicht. Aber man kann auch „Zeilen“ schicken, die nicht mit einem Newline enden, aber trotzdem noch nicht am EOF sind.
[quote=rudis]Aber man kann auch “Zeilen” schicken, die nicht mit einem Newline enden, aber trotzdem noch nicht am EOF sind.
[/quote]
Wie würde das funktionieren?
Mein Problem ist ja, dass EOF, wie arw sagt, auch in einer nichtleeren Zeile auftreten kann. Da ich hier mit fgets durch eine Datei gehen will, muss ich das EOF erkennen können um fgets rechtzeitig zu stoppen. Wenn das EOF nicht in einer eigenen leeren Zeile steht, gibt fgets jedoch nicht NULL zurück, weshalb ich eine andere Möglichkeit brauche um EOF zu erkennen.
Solange [m]fgets[/m] Input-Daten zurückgibt, gibt es keinen Grund, auf EOF zu prüfen. Erst wenn [m]fgets[/m] fehlschlägt, muss man prüfen, ob ein Fehler aufgetreten ist, oder ob keine weiteren Daten kommen.
stairf hat eigentlich schon alles gesagt, aber nur um das nochmal zu verdeutlichen: EOF ist kein Zeichen. Es ist der Zustand, dass die Datei bis zum Ende gelesen wurde (End-Of-File). Es kann nicht „in“ einer Datei auftreten, weil diese bis dahin noch nicht zu Ende gelesen wurde.