2017-02-19 2 views
0
/ * fgets:  get at most n chars from iop */

char * fgets(char * s, int n, FILE * iop) 
{ 
    register int c; 
    register char * cs; 
    cs = s; 
    while (-n > 0 && (c = getc(iop)) != EOF) 
     if ((* cs++ = c) == ′\n′) 
      break; 
    *cs = ′\0′; 
    return (c == EOF && cs == s) ? NULL : s; 
} 

bitte meine Frage ist, warum cs == s, in der Rückkehr Aussage. da fgets NULL zurückgeben soll, wenn das Ende der Datei oder ein Fehler aufgetreten ist, warum gibt die Rückgabeanweisung nicht einfach zurück (c == EOF)? NULL: s;fgets c standardbibliothek funktion

getc, ist auch eine c-Standard-Bibliotheksfunktion, die ein Zeichen aus der Datei iop gleichzeitig liest. Die Funktion fgets liest eine Zeile aus der Datei, auf die iop zeigt, und gibt, falls erfolgreich, die Zeile aus, die im Zeichenfeld s gespeichert ist. NULL zurück, wenn das Ende der Datei angetroffen wird, oder Fehler aufgetreten

prost

+0

getc, ist auch eine c-Standard-Bibliotheksfunktion, die ein Zeichen aus der Datei iop gleichzeitig liest. Die Funktion fgets liest eine Zeile aus der Datei, auf die iop zeigt, und gibt, falls erfolgreich, die Zeile aus, die im Zeichenfeld s gespeichert ist. gibt NULL zurück, wenn das Ende der Datei angetroffen wird oder ein Fehler aufgetreten ist – Evan

Antwort

2

warum ist nicht die return-Anweisung nur return (c == EOF) ? NULL : s;

Denn wenn cs != s dann offensichtlich wurden einige Bytes erfolgreich vor Ende gelesen -of-file oder ein Fehler aufgetreten ist, und es wäre eindeutig falsch für fgets()NULL zurückgeben, wenn es etwas vor dem Ende der Datei erfolgreich gelesen hat.

+0

Dies ist eine Zeile aus der Progammierung in C-Buch (K & R) - Normalerweise fgets returns line; Am Ende der Datei oder des Fehlers wird NULL zurückgegeben. Laut dem Buch wurde die oben beschriebene fgets-Implementierung aus der Standardbibliothek – Evan

+0

kopiert. Dies ist eine Zeile, aus der Progammierung in c-Buch (K & R) - Normalerweise fgets returns line; Am Ende der Datei oder des Fehlers wird NULL zurückgegeben. Laut dem Buch wurde die obige fgets-Implementierung aus der Standardbibliothek kopiert. Wenn also c == EOF && cs! = s, wird s zurückgegeben. Aber c == EOF – Evan

+0

@ user3856947: Ja, das stimmt. Dies geschieht jedes Mal, wenn Sie die letzte Zeile einer Datei lesen, wenn das letzte Zeichen der Datei kein Zeilenvorschubzeichen ist. In diesem Fall liest 'fgets()' die letzte Zeile, erreicht das Ende der Datei und gibt dann die letzte Zeile zurück. So soll es funktionieren. Wenn es auf diese Weise nicht funktioniert, können Sie niemals die letzte Zeile einer solchen Datei lesen. Die * nächste * Zeit 'fgets()' wird aufgerufen, vorausgesetzt, die Datei wurde nicht geändert, sie befindet sich immer noch am Ende der Datei, aber jetzt werden keine Daten mehr zu lesen sein, also * dann * wird sie zurückgeben NULL. –