2010-01-15 6 views
6

Ich versuche nur jedes Zeichen der Datei zu lesen und es auszudrucken, aber wenn die Datei zu Ende gelesen, aber ich bekomme eine Menge? nach dem Lesen. Wie repariere ich es?Wie kann ich aufhören zu lesen von Datei in C

#include <stdio.h> 

int main(void){ 
    FILE *fr;   /* declare the file pointer */ 

    fr = fopen ("some.txt", "r"); /* open the file for reading */ 
     /* elapsed.dta is the name of the file */ 
     /* "rt" means open the file for reading text */ 
    char c; 
    while((c = getc(fr)) != NULL) 
    { 
     printf("%c", c); 
    } 
    fclose(fr); /* close the file prior to exiting the routine */ 
    /*of main*/ 


    return 0; 
} 
+0

Haben Sie versucht, mit allen Warnungen zu kompilieren? Ich habe das Gefühl, dass Ihre while-Schleife das Problem ist, aber ich bin mir nicht sicher. Wenn es das ist, was ich denke, wird eine Warnung angezeigt, wenn Sie mit allen aktivierten Warnungen kompilieren. –

+0

Alles, was Sie über FILE wissen müssen, finden Sie hier: http://www.cplusplus.com/reference/clibrary/cstdio/FILE/ – Phong

+0

Sie sollten vorsichtiger sein bezüglich des Rückgabetyps von 'getc()', und das auch erkennen 'NULL' ist ein Zeiger. –

Antwort

7

Trotz seines Namens, getc gibt ein int, kein char, so dass es kann alle möglichen Zeichenwerte darstellen und zusätzlich EOF (Dateiende). Wenn getc eine char zurückgibt, gibt es keine Möglichkeit, das Ende der Datei anzugeben, ohne einen der Werte zu verwenden, die möglicherweise in der Datei enthalten sein könnten.

Also, um Ihren Code zu beheben, müssen Sie zuerst die Deklaration char c; in int c; ändern, so dass es den EOF-Marker halten kann, wenn es zurückgegeben wird. Dann müssen Sie auch die while-Schleife ändern, um nach EOF anstelle von NULL zu suchen.

Sie können auch feof(fr) aufrufen, um das Ende der Datei getrennt vom Lesen des Zeichens zu testen. Wenn Sie das taten, könnten Sie c als char verlassen, aber Sie müssten feof() aufrufen, nachdem Sie das Zeichen gelesen haben, aber bevor Sie es ausgedruckt haben, und verwenden Sie eine break, um aus der Schleife herauszukommen.

+2

Seien Sie vorsichtig, wenn Sie 'feof' verwenden: http://c-faq.com/stdio/feof.html – jamesdlin

+0

@jamesdlin: Danke für die Warnung. – benzado

+1

Nit: in C kann einfaches 'char' signiert oder vorzeichenlos sein. Ihre obige Aussage ist wahr, wenn 'char' nicht vorzeichenbehaftet ist, aber wenn 'char' signiert ist, kann * * in der Lage sein, 'EOF' darzustellen. Normalerweise ist 'EOF' eine kleine negative Konstante (-1 zum Beispiel), und das wird leicht in einem 'signed char' dargestellt. –

1

fgetc() kehrt EOF auf End-of-Datei, nicht NULL.

1

Ersetzen Sie "NULL" durch "EOF".

2

Wenn nicht erfolgreich, gibt fgetc() EOF zurück.

int c; 
while ((c = getc(fr)) != EOF) 
{ 
    printf("%c", c); 
} 
+0

c muss auch als int deklariert werden. –

+0

@Emerick Rogul: willst du diesen Kommentar unter der ursprünglichen Frage? –

1

Ändern Sie diese

char c; 
while((c = getc(fr)) != NULL) 
{ 
    printf("%c", c); 
} 

zu

char c; 
int charAsInt; 
while((charAsInt = getc(fr)) != EOF) 
{ 
    c = (char) charAsInt; 
    printf("%c", c); 
} 

Mit anderen Worten: Sie müssen gegen EOF vergleichen, nicht NULL. Sie müssen auch eine int Variable verwenden, um den Rückgabewert von zu erhalten. Wenn Sie eine char verwenden, kann der Vergleich mit EOF fehlschlagen, und Sie werden wieder da sein, wo Sie begonnen haben.

+0

Viele andere Funktionen erwarten den Typ 'int', obwohl sie normalerweise nur im Bereich von' char' arbeiten. 'putchar',' isdigit', 'strchr' usw. – dreamlax

1

Andere haben bereits das Problem angesprochen, das Sie haben, aber anstatt printf("%c", c); zu verwenden, ist es wahrscheinlich viel effizienter, putchar(c); zu verwenden. Wenn Sie printf fragen, um nur ein Zeichen zu drucken, ist einiges mit dem Aufwand verbunden.

+0

Richtig, aber dasselbe gilt für die Verwendung von' fgetc' anstelle von 'fgets' oder' fscanf'. –

+0

Außerdem versucht SuperString, C. zu lernen. Die infinitesimale Menge an Overhead ist zu diesem Zeitpunkt nicht wichtig, und zu lernen, wie man printf verwendet, ist im allgemeinen nützlicher als putchar. Da dies keine Antwort auf die Frage ist, sollten Sie einen Kommentar hinterlassen haben. – benzado

+1

Die Verwendung von 'getc' mit' putchar' macht mehr Sinn, da man ein Zeichen von 'stdin' lesen will und das andere ein Zeichen nach' stdout' ausgeben soll. – dreamlax

1

getc gibt eine int zurück.

ändern char c, zu int c.

auch getc kehrt EOF, Ihren Test gegen NULL ändern zu einem Test gegen EOF

Verwandte Themen