Was ist EOF in der Programmiersprache C?

Lesezeit: 9 Minuten

Benutzeravatar von Chris_45
Chris_45

Wie bekommt man den letzten Druck zu sehen? Mit anderen Worten, was ist für EOF einzureichen? Ich habe die Definitionen überprüft und es heißt, dass EOF -1 ist.

Und wenn Sie Strg-D eingeben, sehen Sie nichts.

#include <stdio.h>

int main() {
 int c;
 while((c = getchar() != EOF)) {
  printf("%d\n", c);
 }
 printf("%d - at EOF\n", c);
}

  • Haben Sie etwas dagegen zu klären? Was ist deine Frage?

    – qrdl

    23. November 2009 um 9:41 Uhr

  • Ich möchte EOF einfügen und printf(“%d – at EOF\n”, c) sehen;

    – Chris_45

    23. November 2009 um 9:45 Uhr

  • und EOF soll -1 sein, aber es interpretiert das als drei Zeichen und gibt drei Einsen aus

    – Chris_45

    23. November 2009 um 9:46 Uhr

  • @reinierpost: EOF in C ist ein in stdio.h definiertes Makro.

    – Lukas

    23. November 2009 um 10:27 Uhr

  • Ich fand das sehr nützlich: latedev.wordpress.com/2012/12/04/all-about-eof

    – Koray Tugay

    13. Januar 2015 um 16:44 Uhr

Auf Linux-Systemen und OS X ist das Zeichen, das eingegeben werden muss, um ein EOF zu verursachen StrgD. Für Windows ist es StrgZ.

Je nach Betriebssystem funktioniert dieses Zeichen nur, wenn es das erste Zeichen in einer Zeile ist, also das erste Zeichen nach einem Eintreten. Da die Konsoleneingabe oft zeilenorientiert ist, erkennt das System das EOF-Zeichen möglicherweise auch erst, nachdem Sie ihm ein gefolgt haben Eintreten.

Und ja, wenn dieses Zeichen als EOF erkannt wird, wird Ihr Programm niemals das tatsächliche Zeichen sehen. Stattdessen erhält ein C-Programm a -1 aus getchar().

  • Ok, aber was ist der Unterschied zwischen Strg-z und Strg-D unter Windows? Strg-z = EFO Strg-D = töten?

    – Chris_45

    23. November 2009 um 10:14 Uhr

  • @Chris_45: Unter Windows markiert Strg-Z EOF, Strg-D ist nur Strg-D (oder Zeichen 04). @gotch4: Es ist Standard (aber wenig verwendet) HTML: < kbd >.

    – Carl Smotricz

    23. November 2009 um 11:50 Uhr

  • @ Chris_45: Strg-D entspricht ASCII EOT (Ende der Übertragung), MS-DOS verwendete jedoch Strg-Z (ASCII SUB) für die Kompatibilität mit CP / M, und Windows erbt dies. In CP/M war das EOF-Zeichen tatsächlich ein Zeichen in der Datei, da alle Dateien ein Vielfaches von 128 Zeichen sein mussten. Das zum Signalisieren von EOF verwendete Zeichen ist spezifisch für das Betriebssystem, nicht für die Programmiersprache. en.wikipedia.org/wiki/Ende der Datei

    – Clifford

    23. November 2009 um 14:15 Uhr

  • Nun, ich meinte den Unterschied zwischen Strg-Z und Strg-C? nicht Strg-d

    – Chris_45

    23. November 2009 um 14:34 Uhr

  • Dann sagen Sie es doch! 🙂 Strg-C beendet normalerweise ein Programm, das Eingaben von der Konsole akzeptiert. Strg-D markiert das Ende der Eingabe, aber das Programm könnte danach weiterlaufen.

    – Carl Smotricz

    23. November 2009 um 19:07 Uhr

Benutzeravatar von Lucas
Lukas

Sie sollten Ihre Klammer zu ändern

while((c = getchar()) != EOF)

Weil der “=”-Operator eine niedrigere Priorität hat als der “!=”-Operator. Dann erhalten Sie die erwarteten Ergebnisse. Ihr Ausdruck ist gleich

while (c = (getchar()!= EOF))

Sie erhalten die beiden 1en als Ausgabe, weil Sie den Vergleich “c!=EOF” machen. Dies wird immer eins für das eingegebene Zeichen und dann das “\n”, das folgt, wenn Sie die Eingabetaste drücken. Mit Ausnahme des letzten Vergleichs, bei dem c wirklich EOF ist, erhalten Sie eine 0.

BEARBEITEN zu EOF: EOF ist normalerweise -1, aber dies wird vom Standard nicht garantiert. Der Standard definiert EOF nur in Abschnitt 7.19.1:

EOF, das zu einem ganzzahligen konstanten Ausdruck mit dem Typ int und einem negativen Wert erweitert wird, der von mehreren Funktionen zurückgegeben wird, um das Dateiende anzuzeigen, d. h. keine weitere Eingabe von einem Stream;

Es ist vernünftig anzunehmen, dass EOF gleich -1 ist, aber wenn Sie EOF verwenden, sollten Sie nicht gegen den spezifischen Wert testen, sondern stattdessen das Makro verwenden.

  • “EOF, das zu einem ganzzahligen konstanten Ausdruck erweitert wird, mit Typ int und einem negativen Wert” Int ist 32 Bit und EOF signalisiert den Erfolg typischerweise auf dem wchar_t-Wert von -1 (oder 65535) oder dem char-Wert -1 mit einem Fremdwert ÿ.

    – Laurie Stearn

    23. Januar 2016 um 4:25 Uhr


  • @LaurieStearn: In C ist EOF wirklich nur ein Makro, das zu einem konstanten ganzzahligen Ausdruck erweitert wird (normalerweise in einem Header wie folgt definiert: #define EOF (-1)) und ist daher typischerweise 4 Byte breit. Das EOF-Makro signalisiert nichts, da es nur ein Wert ist. getchar – wie in der Standardbibliothek definiert – gibt immer einen ganzzahligen Wert zurück und wenn es einen Wert zurückgibt, der EOF entspricht (typischerweise -1), zeigt es an, dass es das Ende der Datei erreicht hat. Der zugrunde liegende Mechanismus ist offensichtlich abhängig von Ihrer C-Laufzeit und Sie können keine wirklich verallgemeinernden Aussagen treffen.

    – Lukas

    23. Januar 2016 um 13:30 Uhr


  • @Lucas: Verzeihen Sie meinen Necro-Rant, einverstanden. In VS10 ist der 65535 nicht unbedingt ein intaber mit dem 2er-Komplement und dem Vorzeichen-Bit ist etwas los, damit es so aussieht, als ob es so wäre.

    – Laurie Stearn

    23. Januar 2016 um 13:54 Uhr

  • Gah, wusste nicht, dass es eine breite Version von EOF gibt, wie hier erklärt.

    – Laurie Stearn

    24. Januar 2016 um 6:50 Uhr

Benutzeravatar von Stephen C
Stefan C

Der Wert von EOF ist eine negative Ganzzahl, um ihn von “char”-Werten im Bereich von 0 bis 255 zu unterscheiden. Er ist normalerweise -1, aber es könnte jede andere negative Zahl sein … gemäß den POSIX-Spezifikationen, also Sie sollte nicht davon ausgehen, dass es -1 ist.

Das ^D-Zeichen ist das, was Sie in einen Konsolenstream unter UNIX/Linux eingeben, um ihm mitzuteilen, dass es einen Eingabestream logisch beenden soll. Aber in anderen Kontexten (wie wenn Sie aus einer Datei lesen) ist es nur ein weiteres Datenzeichen. In beiden Fällen gelangt das Zeichen ^D (was das Ende der Eingabe bedeutet) nie in den Anwendungscode.

Wie @Bastien sagt, wird EOF auch zurückgegeben, wenn getchar() scheitert. Genau genommen solltest du anrufen ferror oder feof um zu sehen, ob das EOF einen Fehler oder ein Ende des Streams darstellt. Aber in den meisten Fällen wird Ihre Anwendung in beiden Fällen dasselbe tun.

  • Sie können also niemals den EOF auf win32 zum Appcode machen und den letzten Ausdruck sehen?

    – Chris_45

    23. November 2009 um 9:53 Uhr

  • @ Chris_45 – Ich spreche über die Bedeutung von EOF. Die Hauptursache des Fehlers in Ihrem “Appcode” ist etwas ganz anderes – siehe die Antwort von @Lucas.

    – Stefan C

    23. November 2009 um 21:33 Uhr

Benutzeravatar von sud03r
sud03r

Paar Tippfehler:

while((c = getchar())!= EOF)

anstelle von:

while((c = getchar() != EOF))

Auch getchar() behandelt eine Return-Taste als gültige Eingabe, also müssen Sie sie auch puffern. EOF ist eine Markierung, die das Ende der Eingabe anzeigt. Im Allgemeinen ist es ein Int, bei dem alle Bits gesetzt sind.


#include <stdio.h>
int main()
{
 int c;
 while((c = getchar())!= EOF)
 {
  if( getchar() == EOF )
    break;
  printf(" %d\n", c);
 }
  printf("%d %u %x- at EOF\n", c , c, c);
}

Drucke:

49
50
-1 4294967295 ffffffff- at EOF

zur Eingabe:

1
2
<ctrl-d>

Benutzeravatar von Ikke
Ikke

EOF bedeutet Dateiende. Es ist ein Zeichen dafür, dass das Ende einer Datei erreicht ist und keine Daten mehr vorhanden sind.

Bearbeiten:

Ich stehe korrigiert. In diesem Fall ist es kein Dateiende. Wie bereits erwähnt, wird es übergeben, wenn STRG+d (Linux) oder STRG+z (Windows) übergeben wird.

  • Die Bearbeitung ist falsch. Der Satz “es wird übergeben, wenn STRG+d…ist [pressed]” ist Unsinn. Wenn der Benutzer Strg-D eingibt, wird die Eingabedatei geschlossen und getchar gibt EOF zurück, um anzuzeigen, dass das Dateiende erreicht wurde. Es gibt kein EOF-Zeichen, das an den Prozess gesendet wird.

    – William Pursel

    9. Januar 2013 um 22:47 Uhr

  • Was meinst du, es ist ein Zeichen? Ist es ein bestimmtes Bitmuster?

    – Koray Tugay

    11. Januar 2015 um 12:09 Uhr

  • Er bedeutet Zeichen im normalen (nicht-IT, nicht-mathematischen) Sinne; dh ein Hinweis. Beim Hund wedelt er mit dem Schwanz als Zeichen, dass er glücklich ist.

    – Stefan C

    16. April 2020 um 6:03 Uhr


Benutzeravatar von user2864740
Benutzer2864740

Die Eingabe von einem Terminal “endet” nie wirklich (es sei denn, das Gerät wird getrennt), aber es ist nützlich, mehr als eine “Datei” in ein Terminal einzugeben, daher ist eine Tastenfolge reserviert, um das Ende der Eingabe anzuzeigen. In UNIX wird die Übersetzung des Tastendrucks in EOF vom Terminaltreiber durchgeführt, sodass ein Programm Terminals nicht von anderen Eingabedateien unterscheiden muss. Standardmäßig wandelt der Treiber ein Control-D-Zeichen am Anfang einer Zeile in eine Dateiende-Anzeige um. Um ein tatsächliches Control-D (ASCII 04)-Zeichen in den Eingabestrom einzufügen, stellt der Benutzer ihm ein „Anführungszeichen“-Befehlszeichen (normalerweise Control-V) voran. AmigaDOS ist ähnlich, verwendet aber Control-\ anstelle von Control-D.

In Microsofts DOS und Windows (und in CP/M und vielen DEC-Betriebssystemen) wird das Lesen vom Terminal niemals ein EOF erzeugen. Stattdessen erkennen Programme, dass die Quelle ein Terminal (oder ein anderes “Zeichengerät”) ist, und interpretieren ein bestimmtes reserviertes Zeichen oder eine bestimmte Sequenz als Dateiende-Anzeige; Am häufigsten ist dies ein ASCII-Control-Z, Code 26. Einige MS-DOS-Programme, einschließlich Teile der Microsoft MS-DOS-Shell (COMMAND.COM) und Betriebssystem-Dienstprogramme (z. B. EDLIN), behandeln ein Control-Z in einer Textdatei als Markierung des Endes sinnvoller Daten und/oder hängen Sie beim Schreiben einer Textdatei ein Control-Z an das Ende an. Dies geschah aus zwei Gründen:

  1. Abwärtskompatibilität mit CP/M. Das CP/M-Dateisystem zeichnete die Längen von Dateien nur in Vielfachen von 128-Byte-“Datensätzen” auf, daher wurde per Konvention ein Control-Z-Zeichen verwendet, um das Ende sinnvoller Daten zu markieren, wenn es mitten in einem Datensatz endete. Das MS-DOS-Dateisystem hat immer die genaue Bytelänge von Dateien aufgezeichnet, daher war dies unter MS-DOS nie erforderlich.

  2. Es ermöglicht Programmen, denselben Code zu verwenden, um Eingaben sowohl von einem Terminal als auch von einer Textdatei zu lesen.

  • Die Bearbeitung ist falsch. Der Satz “es wird übergeben, wenn STRG+d…ist [pressed]” ist Unsinn. Wenn der Benutzer Strg-D eingibt, wird die Eingabedatei geschlossen und getchar gibt EOF zurück, um anzuzeigen, dass das Dateiende erreicht wurde. Es gibt kein EOF-Zeichen, das an den Prozess gesendet wird.

    – William Pursel

    9. Januar 2013 um 22:47 Uhr

  • Was meinst du, es ist ein Zeichen? Ist es ein bestimmtes Bitmuster?

    – Koray Tugay

    11. Januar 2015 um 12:09 Uhr

  • Er bedeutet Zeichen im normalen (nicht-IT, nicht-mathematischen) Sinne; dh ein Hinweis. Beim Hund wedelt er mit dem Schwanz als Zeichen, dass er glücklich ist.

    – Stefan C

    16. April 2020 um 6:03 Uhr


Benutzeravatar von Heinzi
Heinzi

#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
        printf("%d\n", c);
    }
    printf("%d - at EOF\n", c);
}

Ich denke, dies ist der richtige Weg, um den Wert von EOF zu überprüfen. Und ich habe die Ausgabe überprüft.

Für INPUT: abc und Enter habe ich OUTPUT: 97 98 99 10. (die ASCII-Werte)

Für INPUT Ctrl-D bekam ich OUTPUT: -1 – bei EOF. Ich denke also, dass -1 der Wert für EOF ist.

Probieren Sie andere Eingaben anstelle von Strg-D aus, z. B. Strg-Z. Ich denke, das ist von Compiler zu Compiler unterschiedlich.

  • Sicher, stdio.h definiert EOF wie -1. Aber das sollte Sie nicht interessieren, Sie müssen es auch nicht anschauen oder ausdrucken. Suchen Sie einfach nach EOF in Ihrem Code und lassen Sie den Compiler sich um die Details kümmern.

    – Carl Smotricz

    23. November 2009 um 11:57 Uhr

1408550cookie-checkWas ist EOF in der Programmiersprache C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy