Rückgabewert von fgets()

Lesezeit: 3 Minuten

Ich habe erst vor kurzem angefangen, mit zu arbeiten I/O in C. Hier ist meine Frage –
Ich habe eine Datei, aus der ich meine Eingaben lese. Dann verwende ich fgets() um Strings in einen Puffer zu bekommen, die ich irgendwie verwende. Was passiert nun, wenn die Eingabe zu kurz für den Puffer ist, dh wenn der erste durchgelesen wird fgets() erreicht EOF. Sollte fgets() Rückkehr NULL(wie ich gelesen habe fgets() Dokumentation)? Es scheint, dass dies nicht der Fall ist, und ich bekomme meine Eingaben richtig. Neben sogar meine feof(input) sagt nicht, dass wir erreicht haben EOF.
Hier ist mein Codeschnipsel.

char    buf[BUFSIZ];
FILE    *input,
        *output;

input   = fopen(argv[--argc], "r");
output  = fopen(argv[--argc], "w");

/**
 *  If either of the input or output were unable to be opened
 *          we exit
 */
if (input == NULL) {
    fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 1]);
    exit(EXIT_FAILURE);
}

if (output == NULL) {
    fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 0]);
    exit(EXIT_FAILURE);
}

if (fgets(buf, sizeof(buf), input) != NULL) {
    ....
}

/**
 *  After the fgets() condition exits it is because, either -
 *      1) The EOF was reached.
 *      2) There is a read error.
 */
if (feof(input)) {
    fprintf(stdout, "Reached EOF.\n");
}
else if (ferror(input)) {
    fprintf(stdout, "Error while reading the file.\n");
}

  • Beachten Sie, dass feof(input) wird nur wahr zurückgeben nach versuchen Vergangenheit lesen EOF. Es sagt dir nicht, dass du es bist bei EOF.

    – Schleicher

    10. Februar 2014 um 13:54 Uhr

  • Können Sie das im Kontext des obigen Beispiels erläutern? Vermuten, fgets() liest nur 100 bytes (BUFSIZE ist 512), sollte fgets() Rückkehr NULL?

    – yadav_vi

    10. Februar 2014 um 13:58 Uhr

  • Ok, jetzt merke ich, wie dumm mein Kommentar war; jedenfalls verstehe ich was du meinst. Wie überprüfe ich, ob EOF erreicht wurde?

    – yadav_vi

    10. Februar 2014 um 14:04 Uhr

Benutzeravatar von ablight
ableuchten

Die Dokumentation für fgets() sagt nicht, was du denkst:

Aus meiner Manpage

fgets() liest höchstens eins weniger als ein size Zeichen aus dem Stream und speichert sie in dem Puffer, auf den gezeigt wird s. Das Lesen stoppt nach einem EOF oder ein Zeilenumbruch. Wenn ein Zeilenumbruch gelesen wird, wird er im Puffer gespeichert. Ein abschließendes Null-Byte (‘\0‘) wird nach dem letzten Zeichen im Puffer gespeichert.

Und später

gets() und fgets() Rückkehr s auf Erfolg und NULL bei einem Fehler oder wenn das Dateiende auftritt, während noch keine Zeichen gelesen wurden.

Ich verstehe das nicht als Aussage EOF wird als Fehlerbedingung behandelt und zurückgegeben NULL. In der Tat heißt es a NULL würde nur wo auftreten EOF passiert wenn nein Zeichen wurden gelesen.

Der POSIX-Standard (der sich auf den weniger zugänglichen C-Standard bezieht) ist hier: http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html und erklärt:

Nach erfolgreichem Abschluss fgets() werden zurückkehren s. Wenn der Stream am Dateiende ist, wird der Dateiende-Indikator für den Stream gesetzt und fgets() soll einen Nullzeiger zurückgeben. Wenn ein Lesefehler auftritt, muss die Fehleranzeige für den Stream gesetzt werden, fgets() soll einen Nullzeiger zurückgeben und setzen errno um den Fehler anzuzeigen.

Dies zeigt deutlich an, dass nur a zurückgegeben wird NULL wenn es wirklich an ist EOF wenn aufgerufen, dh wenn irgendein Bytes werden gelesen, es wird nicht zurückgegeben NULL.

  • Können Sie erklären feof() Teil, warum druckt es nichts. EOF wurde richtig erreicht?

    – yadav_vi

    10. Februar 2014 um 14:00 Uhr

  • feof() testet die Dateiende-Anzeige, die nur gesetzt wird, wenn Sie bereits einen Fehler hatten, bei dem Sie versucht haben, über das Ende der Datei hinaus zu lesen. Es zeigt (verwirrenderweise) nicht an, dass Sie sich am Ende der Datei befinden.

    – Licht

    10. Februar 2014 um 14:03 Uhr

  • Du machst das fgets() wieder wirst du bekommen EOF. Das ist die normale Art zu testen.

    – Licht

    10. Februar 2014 um 14:09 Uhr

  • @yadav_vishal was ablight gesagt hat. Sie verwenden weiter fgets bis du siehst, dass es zurückkehrt NULL um die Schleife zu beenden. An diesem Punkt, feof sollte seit dem TRUE sein NULL meint fgets versucht, über EOF hinaus zu lesen.

    – Schleicher

    10. Februar 2014 um 14:24 Uhr

  • Ich habs! Vielen Dank! Ich habe ein verwendet if()hätte a verwenden sollen while().

    – yadav_vi

    10. Februar 2014 um 14:28 Uhr

1432370cookie-checkRückgabewert von fgets()

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

Privacy policy