Darstellen von EOF in C-Code?
Dem newline-Zeichen wird vertreten durch "\n"
im C-code. Gibt es ein äquivalent für die end-of-file (EOF) Zeichen?
InformationsquelleAutor der Frage static_rtti | 2012-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
EOF ist nicht ein Zeichen (in den meisten modernen Betriebssystemen). Es ist einfach eine Bedingung, die gilt für ein stream-Datei, wenn das Ende des Streams erreicht ist. Die Verwirrung entsteht, weil ein Benutzer kann signal EOF für die Konsole zur Eingabe von Eingabe von einem speziellen Charakter (e.g Control-D auf Unix, Linux, et al), aber dieser Charakter ist nicht ersichtlich das Programm läuft, ist es vom Betriebssystem abgefangen, die wiederum Signale EOF, um den Prozess.
Hinweis: in einigen sehr alten Betriebssystemen EOF war ein Zeichen, z.B. Control-Z im CP/M, aber das war ein rohes hack zu vermeiden, den Aufwand für die Verwaltung der eigentlichen Datei-Längen in der Datei-system-Verzeichnisse.
InformationsquelleAutor der Antwort Paul R
Nicht. EOF ist kein Zeichen, sondern ein Zustand, der filehandle.
Während es gibt es gibt steuerzeichen im ASCII-Zeichensatz darstellt, die das Ende der Daten, diese werden nicht verwendet, um zu signalisieren, das Ende von Dateien im Allgemeinen. Zum Beispiel EOT (^D), die in einigen Fällen fast-Signale die gleichen.
Wenn die standard-C-Bibliothek verwendet vorzeichenbehaftete integer -, Zeichen zurück, und setzt " -1 " für das Ende der Datei, das ist eigentlich nur das signal zu geben, als ein Fehler passiert ist. Ich habe nicht den C-standard verfügbar, aber zitieren SUSv3:
InformationsquelleAutor der Antwort pmakholm
EOF
ist nicht ein Zeichen. Kann es nicht sein: Eine (binäre) Datei kann beliebige Zeichen enthalten. Angenommen, Sie haben eine Datei mit stetig steigenden bytes, gehen 0 1 2 3 ... 255 und wieder mit 0 1 ... 255, für eine Gesamtmenge von 512 bytes. Je nachdem was man von diesen 256 möglichen bytes, die du alsEOF
die Datei wird kurz geschnitten.Deshalb
getchar()
et al. Rückkehr einerint
. Die Palette der möglichen Rückgabewerte sind diejenigen, die einechar
können, plus eine echteint
WertEOF
(definiert instdio.h
). Das ist auch der Grund, warum die Umwandlung der Rückgabewert einechar
vor Prüfung fürEOF
wird nicht funktionieren.Beachten Sie, dass einige Protokolle haben "EOF" "Zeichen." ASCII hat "End of Text" "Ende der Übertragung", "End of Transmission Block" und "End of Medium". Anderen Antworten erwähnt haben alte Betriebssysteme. Ich selbst input ^D auf Linux und ^Z auf Windows-Konsolen aufhören, Programme input. (Aber die Dateien Lesen über Rohre haben ^D und ^Z-Zeichen überall und nur EOF-signal, wenn Sie laufen von bytes.) C-strings sind terminiert mit dem
'\0'
Charakter, aber das bedeutet auch, dass Sie nicht enthalten den Charakter'\0'
. Das ist, warum alle C nicht-string-Daten-Funktionen arbeiten mit einemchar
array (die Daten enthalten) und einsize_t
(zu wissen, wo die Daten enden).Edit: Der C99-standard §7.19.1.3 Staaten:
InformationsquelleAutor der Antwort aib
Habe ich all die Kommentare Lesen. Es ist interessant zu bemerken, was passiert, wenn Sie drucken diese:
Wie wir hier sehen können, EOF ist NICHT ein Zeichen (auch immer).
InformationsquelleAutor der Antwort Carlos W. Mercado
Des EOF-Zeichens anerkannt durch den Kommando-interpreter unter Windows (und MS-DOS-und CP/M) 0x1a (dezimal 26, auch bekannt als Strg+Z aka SUB)
Kann es immer noch verwendet werden, heute zum Beispiel zu markieren das Ende einer Mensch-lesbarer header in einer binären Datei: wenn die Datei beginnt mit "some description\x1a" kann der user dump der Inhalt der Datei auf der Konsole mit dem Befehl TYPE und den dump halt bei der EOF - Charakterd.h. drucken Beschreibung und zu stoppen, anstatt weiterhin mit dem Müll, der folgt.
InformationsquelleAutor der Antwort Axel Rietschin
Den Wert von EOF kann nicht verwechselt werden mit tatsächlichen Charakter.
Wenn
a= getchar()
ist, dann müssen wir erklärena
groß genug, um halten Sie einen beliebigen Wert, dergetchar()
gibt. Wir können nichtchar
seita
muss groß genug sein, zu halten EOF zusätzlich zu Zeichen.InformationsquelleAutor der Antwort Harsh Vardhan
Die Antwort ist NEIN, aber...
Können Sie verwirrt, weil das Verhalten der
fgets()
Vom http://www.cplusplus.com/reference/cstdio/fgets/ :
InformationsquelleAutor der Antwort betontalpfa
Dies ist system abhängig, aber oft -1. Sehen hier
InformationsquelleAutor der Antwort onoma
Gibt es die Konstante
EOF
vom Typ int, gefunden in stdio.h. Es gibt kein äquivalent zeichenliteral angegeben werden standard.InformationsquelleAutor der Antwort Lundin
Ich denke, es kann variieren von system zu system, aber eine Möglichkeit der Kontrolle wäre, nur verwenden
printf
Habe ich diese auf Windows und
-1
war auf der Konsole ausgegeben. Hoffe, das hilft.InformationsquelleAutor der Antwort Keith Miller