Ich habe gerade die Antworten zu "Entfernen eines Newline-Zeichens am Ende einer Datei" gelesen und alle sagten, dass sie das letzte Zeichen löschen sollen. Meine Frage ist, ist der eof Charakter nicht der letzte?
Ich habe gerade die Antworten zu "Entfernen eines Newline-Zeichens am Ende einer Datei" gelesen und alle sagten, dass sie das letzte Zeichen löschen sollen. Meine Frage ist, ist der eof Charakter nicht der letzte?
Antworten:
Eine Datei endet nicht mit einem Dateiende-Zeichen, wie in den vorherigen Antworten korrekt angegeben. Aber ich denke, die Antworten und Kommentare enthalten einige Ungenauigkeiten, auf die es sich hinzuweisen lohnt:
Der ASCII-Zeichensatz enthält kein genaues EOF-Zeichen. Es gibt mehrere Steuerzeichen für "Ende": Textende (3), Übertragungsende (4), Übertragungsende-Block (23), Medienende (25). File Separator (28) kommt einem EOF-Zeichen möglicherweise am nächsten. Code 26 ist "Ersatz", nicht EOF.
Ctrl- Dist nur mit dem Klemmeneingang verbunden. Zum Beispiel beinhaltet der Befehl
cat filea fileb filec > outfile
nicht Ctrl- D. Übrigens können Sie das EOF-Zeichen des Terminals in etwas anderes ändern als Ctrl- Dmit dem stty
Befehl.
Genau genommen ist Ctrl- D(oder was auch immer Sie geändert haben) kein EOF-Schlüsselcode. Dies bewirkt, dass der read
Systemaufruf mit den verfügbaren Eingaben zurückgegeben wird. Ebenso wie das Drücken der Eingabetaste bewirkt, dass der gelesene Systemaufruf eine Zeile mit Zeichen an den Aufrufer zurückgibt. Gemäß der Konvention signalisiert ein Rückgabewert von Null aus dem Lesesystemaufruf (dh Null gelesene Zeichen) ein Ende der Dateibedingung. Die Eingabedatei wird jedoch nicht automatisch geschlossen, und wenn die Eingabe vom Terminal stammt, wird sie nicht in den Status "Dateiende" versetzt. Sie können ein Programm schreiben, das auch nach einem "Dateiende" weiter vom Terminal liest, und der Leseaufruf kann für die nächste Eingabezeile ungleich Null zurückgeben.
Die Analogie zwischen den Zeichen eof und eol wird sichtbar, wenn Ctrl- Dgedrückt wird, wenn bereits eine Eingabe in die Zeile geschrieben wurde. Wenn Sie beispielsweise "abc" schreiben und die Taste drücken Ctrl- Dder Leseaufruf wird zurückgegeben, diesmal mit einem Rückgabewert von 3 und mit "abc", das im als Argument übergebenen Puffer gespeichert ist. Da read nicht 0 zurückgibt, wird dies gemäß der obigen Konvention nicht als EOF-Bedingung interpretiert. Wenn Sie die Eingabetaste drücken, kehrt der gelesene Anruf mit der gesamten Eingabezeile (einschließlich der neuen Zeile) zurück. Sie können dies mit dem cat
Befehl ausprobieren : Schreiben Sie einige Zeichen in die Zeile und drücken Sie Ctrl- D. Sie werden sehen, wie die Zeichen zu Ihnen zurückkehren und cat
auf weitere Eingaben warten.
All dies gilt nur, wenn sich das Terminal im Modus "Gekocht" befindet, im Gegensatz zum Modus "Roh", in dem die Verarbeitung der Zeileneingabe minimiert ist. Im Raw-Modus wird tatsächlich ein Strg-D-Zeichen an den Eingabepuffer übergeben.
ASCII-Steuerzeichen haben Definitionen aus den 1960er Jahren (tatsächlich vor dem, was Sie als Netzwerk betrachten ). Nicht alle dieser Steuerzeichen werden so verwendet, wie sie damals für Telekommunikationsgeräte definiert waren.
Auf Unix-ähnlichen Systemen ist kein EOF
Zeichen erforderlich . es wird keiner verwendet. Das System kann Anwendungen mitteilen, wie viele Bytes sich in einer Datei befinden:
Auf einigen anderen Systemen (in VMS, DOS, Windows) fungiert ein Control-Z möglicherweise als Dateiendemarker, da das System in älteren Versionen einigen Anwendungen nicht mitteilen konnte, wie viele Bytes sich in der Datei befinden.
Bei VMS lag die Einschränkung in der Funktionsweise der C-Laufzeit. Assembler-Anwendungen konnten (und haben) die richtige Dateigröße erhalten.
Unix-Systeme in der Shell verwenden herkömmlicherweise Control-D, um einer Anwendung mitzuteilen, dass das Ende der Eingabe (Datei) erreicht wurde, das Control-D jedoch nicht in der Datei gespeichert ist.
In C EOF
wird bewusst -1
darauf hingewiesen, dass es sich nicht um ein gültiges Zeichen handelt. Standard-E / A wird zurückgegeben, EOF
wenn eine Dateiende-Bedingung erkannt wird - kein Sonderzeichen.
Dateien müssen übrigens nicht mit einem Zeilenumbruch (ASCII-Zeilenvorschub) enden . Texteditoren können mit Dateien umgehen, bei denen es sich ausschließlich um druckbaren Text handelt, für die jedoch keine abschließende Zeile vorhanden ist.
busybox
‚s vi
, etc).
EOF ist kein Charakter. Dies ist ein Status, der angibt, dass keine Zeichen mehr aus einem Dateistream gelesen werden müssen. Wenn Sie den EOF-Befehl über das Terminal eingeben, signalisieren Sie dem Betriebssystem, den Eingabestream zu schließen, ohne ein Sonderzeichen einzugeben.
bash
der Eingang in die Hände kommt, wird er vom TTY-Fahrer massiert. Dieser Treiber fängt Strg-D ab und sendet ein EOF an bash
(wobei EOF kein Zeichen, sondern ein spezieller Dateistatus ist)