2009-10-26 14 views
6

Ist EOF immer negativ?Ist EOF immer negativ?

Ich denke an das Schreiben einer Funktion, die das nächste Wort in der Eingabe liest und die Zeilennummer zurückgibt, in der das Wort gefunden wurde, oder EOF, wenn das Ende der Eingabe erreicht wurde. Wenn EOF nicht unbedingt negativ ist, wäre die Funktion falsch.

+1

Warum müssen Sie sogar EOF von Ihrer eigenen Funktion zurückgeben? Definieren Sie einfach Ihre Funktion als "gibt die Zeilennummer zurück, wo das Wort gefunden wurde, oder -1, wenn das Ende der Eingabe erreicht wurde". Das heißt, viele Quellen (z. B. Code Complete) warnen davor, Rückgabewerte mit Fehlercodes zu mischen. –

+0

Richtig, es ist eine mögliche und vollständig praktikable Alternative. Ich dachte jedoch, EOF wäre expliziter gewesen. – Ree

Antwort

10

Ja, EOF ist immer negativ.

The Standard sagt:

7,19 Eingabe/Ausgabe
7.19.1 Einführung

3 Die Makros sind [...] EOF die konstant auf einen ganzzahligen Ausdruck, mit Typ int und einen negativen Wert, dass zurückgegeben durch mehrere Funktionen erweitert end-of-file, um anzuzeigen, das heißt, nicht mehr Eingang aus einem Strom;

Beachten Sie, dass es kein Problem gibt, wenn "plain" char signiert ist. Die <stdio.h> Funktionen, die sich mit char befassen, werfen die Zeichen speziell auf unsigned char und dann auf int, so dass alle gültigen Zeichen einen positiven Wert haben. Zum Beispiel:

int fgetc(FILE *stream) 

7.19.7.1
... erhält die fgetc Funktion dieses Zeichen als ein unsigned char in einen int umgewandelt ...

+3

Es gibt ein Problem, wenn 'sizeof (char) == sizeof (int)' ist, obwohl auch der Cast über 'unsigned char' nicht unbedingt alle gültigen 'char' Werte positiv behält. Zum Glück ist das relativ selten. –

+0

Das ist nur ein Problem, wenn Sie fälschlicherweise annehmen, dass ein negativer Wert immer EOF ist ('if (ch <0)/* EOF erkannt * /;') oder wenn der "Ausführungszeichensatz" alle Werte von 'INT_MIN' bis' 'verwendet 0 'in diesem Fall ist der 'EOF' Wert der gleiche wie der Wert eines gültigen Zeichens. – pmg

15

EOF ist immer == EOF. Nimm nichts anderes an.

Bei einer zweiten Lesung des Standards (und wie einige andere Kommentare hier) scheint EOF immer negativ - und für die Verwendung in dieser Frage (Zeilennummer oder EOF) angegeben würde es funktionieren. Was ich davor warnen (und immer noch tun muss), ist anzunehmen, dass die Zeichen positiv sind und EOF negativ ist.

Denken Sie daran, dass eine normkonforme C-Implementierung negative Zeichenwerte haben kann - dies wird sogar in der Programmiersprache 'C' erwähnt (K & R). Druckzeichen sind immer positiv, aber auf einigen Architekturen (wahrscheinlich alle alt) sind Steuerzeichen negativ. Der C-Standard spezifiziert nicht, ob der Typ char vorzeichenbehaftet oder vorzeichenlos ist, und die einzige Zeichenkonstante, die garantiert plattformübergreifend den gleichen Wert hat, ist '\0'.

+0

Können Sie einige Referenzen hinzufügen? – Guillaume

+6

Dies ist nicht korrekt. Das EOF-Makro ** muss ** auf eine negative ganze Zahl expandieren, leider habe ich meine Kopie des Standards im Moment nicht zur Hand. –

+0

Die C-Bibliothek-Referenz, die besagt, dass fast alle ihre Informationen aus dem ANSI-C-Standard benötigt, sagt, dass "EOF ist eine negative Ganzzahl, die ein Ende der Datei erreicht hat" (http: // www. Acm .uiuc.edu/webmonkeys/book/c_guide/2.12.html # Variablen). Das heißt, ich würde immer noch sagen, dass es ein schlechter Stil ist, und darüber hinaus ist es unnötig zu vermuten, dass EOF negativ ist. –

8

haben, die Funktion Rückkehr

  • die Zeilennummer das Wort in
  • oder -1, falls das Ende der Eingabe ohne Notwendigkeit

Problem gelöst, erreicht wurde gefunden um auf irgendwelche EOF-Werte zu vertrauen. Der Anrufer kann leicht für einen erfolgreichen Anruf auf größer oder gleich Null testen und andernfalls EOF/IO-Fehler annehmen.

+0

In der Tat ist es eine gute Alternative. – Ree

1

EOF ist eine Bedingung, nicht ein Wert. Der genaue Wert dieses Sentinels ist in der Implementierung definiert. In vielen Fällen ist es eine negative Zahl.

1

Von wikipedia:

Der tatsächliche Wert von EOF ist eine systemabhängige negative Zahl, häufig -1, die garantiert ungleich jeden gültigen Zeichencode zu sein.

aber keine Hinweise ...

von Secure Coding: Detect and handle input and output errors EOF ist negativ, aber nur dann, wenn sizeof(int) > sizeof(char).

+0

Wikipedia ist hier nicht vollständig korrekt. EOF könnte -1 sein, und mit Zeichen mit Vorzeichen kann ein Zeichen den Wert -1 haben (z. B. Das Euro-Symbol in Windows-1252). Was ist der Fall ist, dass der Rückgabewert von "(f) getc" das nächste Zeichen ist, das in ein unsigniertes Zeichen und dann in ein "int" umgewandelt wird und dies nicht mit "EOF" übereinstimmen sollte.Dies kann natürlich nur funktionieren, wenn 'sizeof (int)! = Sizeof (char)' ist. –

2

Vom online draft n1256, 17.9.1.3 :

EOF

, die zu einem ganzzahligen Konstantenausdruck mit dem Typ int und einem negativen Wert erweitert wird, der von mehreren Funktionen zurückgegeben wird, um end-of-file anzugeben, dh keine Eingabe aus einem Stream mehr;

EOF ist immer negativ, obwohl es nicht immer -1 sein kann.

Für Fragen wie diese, ich ziehe Trennung Fehlerbedingungen von Daten, die durch einen Fehlercode zurückkehrt (SUCCESS, END_OF_FILE, READ_ERROR, etc.) als die Rückgabewert der Funktion, und dann die Daten von Interesse für separate Parameter schreiben, wie

int getNextWord (FILE *stream, char *buffer, size_t bufferSize, int *lineNumber) 
{ 
    if (!fgets(buffer, bufferSize, stream)) 
    { 
    if (feof(stream)) return END_OF_FILE; else return READ_ERROR; 
    } 
    else 
    { 
    // figure out the line number 
    *lineNumber = ...; 
    } 
    return SUCCESS; 
}