2016-05-07 13 views
-2

Jungs, ich möchte den Text aus meiner Datei lesen und jedes Zeichen auf ein einzelnes Element des ArraysLesen von Text aus einer Datei mit fscanf()

char A[1000]; 

FILE * fpointer; 
fpointer=fopen("text.txt","r"); 

i=0; 
while(!feof(fpointer)) 
{ 
    fscanf(fpointer,"%c",&A[i]); 
    i=i+1; 
} 

fclose(fpointer); 

for (i=0;i<100;i++) 
{ 
    printf("%c",A[i]); 
} 

return 0; 

aber das Problem ist, weisen Sie, dass der Ausgang ist etwas seltsam Symbole anstelle des Textes der Datei, der "Dies ist nur ein Test" ist. Warum geschieht das?

+0

Wie ist 'A' definiert? – fluter

+0

YE Entschuldigung vergessen, es aufzunehmen: D. char A [1000]; i ist auch als int definiert. – hfsocio

Antwort

5

Mögliche Gründe:

  1. fopen konnte die angegebene Datei öffnen. Korrigieren Sie, indem Sie den Rückgabewert überprüfen.
  2. Siehe Why is “while (!feof (file))” always wrong?
  3. Sie immer 100 Zeichen drucken, aber wenn die Datei weniger als 100 Zeichen enthält, sind Sie in Schwierigkeiten, weil Sie nicht initialisierten Stellen des Arrays zu drucken, zu UB führt. Fix durch Drucken von allem beginnend von Null bis i.

Corrected Code-Schnipsel:

int i = 0, j = 0; 
char A[1000]; 

FILE* fpointer; 
fpointer = fopen("text.txt", "r"); 
if(!fpointer) 
{ 
    fputs("fopen failed! Exiting...\n", stderr); 
    exit(-1); /* Requires `stdlib.h` */ 
} 

while(fscanf(fpointer, "%c", &A[i]) != EOF) 
{ 
    i = i + 1; 
} 

fclose(fpointer); 
for (j = 0; j < i; j++){ 
    printf("A[%d] = '%c'\n", j, A[j]); 
} 
+0

Hinzufügen einer int Variable k machte es während passieren { fscanf (fpointer, "% c", &A[i]); i = i + 1 (feof (fpointer)!); k = i; und dann anstelle von 100 i verwenden, k Scheint zu funktionieren. Danke !!! – hfsocio

+0

Ja, das wird auch funktionieren, aber pass auf, dass du auf Punkt 1 & 2 in meiner Antwort achtest: –

+0

Ich danke für den Tipp !! – hfsocio

1

erweitern auf die points by @Cool Guy:

Falls Ihre Dateien enthalten nicht die null character, Sie eine andere Variable vermeiden kann über die Anzahl der Zeichen speichern lesen . Wenn Sie Ihre eingelesenen Zeichen auf Null setzen, können Sie sie einfach direkt als Zeichenfolge ausgeben.

Sie müssen sicherstellen, dass A genügend Zeichen enthalten kann. Wenn Sie höchstens 1000 Zeichen erwarten, stellen Sie sicher, dass A eine Größe von 1001 Byte hat, um das abschließende NUL-Zeichen zu enthalten.

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    char A[1001] = { 0 }; /* init to NUL, expect at most 1000 chars */ 
    int i;  
    FILE *fpointer; 

    fpointer=fopen("text.txt","r"); 
    if(!fpointer) { 
     perror("Error opening file"); /* print error message */ 
     exit(-1); /* Requires `stdlib.h` */ 
    } 
    /* read all characters from fpointer into A */ 
    for (i=0; fscanf(fpointer, "%c", &A[i]) != EOF; i++); 
    fclose(fpointer); 

    printf("%s\n",A); /* print all characters as a string */ 

    /* alternatively, loop until NUL found */ 
    for (i=0; A[i]; i++) 
     printf("%c", A[i]); 
    printf("\n"); 

    return 0; 
}