2016-05-08 22 views
-3

Hallo Ich habe diesen Code für folgende Frage geschrieben: Schreiben Sie ein C-Programm, das eine Textdatei in ein Array von Zeichen liest. Sie können davon ausgehen, dass die Datei nicht mehr als 1000 Zeichen enthält. Der Code druckt jedoch nur das erste Zeichen des Textes. Wo mache ich Fehler? verwendenEine Textdatei lesen

FILE *wse; 
char a[1000]; 
int i; 

    wse=fopen("21e.txt","r"); 

    for(i=0;i!=100;i++); 
    { 
    fscanf(wse,"%c",&a[i]); 
    printf("%c",a[i]); 
    } 
+0

warum versuchst du nicht fgets direc Sie haben bereits den für Sie vorgesehenen Platz zugewiesen, da fscanf bei der ersten Soave aufhört? – Kiloreux

+1

Oder einfach nur die ganze Datei. Es scheint keinen Grund zu geben, irgendeine Token-Funktion zu verwenden. – Olaf

+2

Ihre 'for' Schleife hat einen leeren Körper. Bitte entfernen Sie das Semikolon nach 'for (i = 0; i! = 100; i ++)' - auch 'i <100' wäre sicherer ... (-: – user3078414

Antwort

1

Schritt eine Minute zurück und lernen Sie die Alternativen, die Sie für die Eingabe haben in C. Sie haben zeichenorientierte Eingabefunktionen (getchar(), fgetc(), etc ..), die eine Datei aus einem Zeichen-at-a-time lesen . Sie haben dann zeilenorientierte Eingabefunktionen (zB fgets und getline), die Linien der Eingabe zu einer Zeit gelesen wird, und schließlich haben Sie blockorientierten Eingabefunktionen wie fread und read, dass Sie die gesamte lesen können Datei in einen einzelnen Speicherblock. (Es gibt einige andere Werkzeuge zum Kopieren und Speicherzugriff wie sendfile und mmamp, die ebenfalls verwendet werden können, aber wahrscheinlich nicht beabsichtigt. Die scanf Familie von Funktionen, obwohl sie dort verwendet werden, sind nicht dazu gedacht, unterschiedliche Werte über mehrere zu lesen Linien.

Ihr grundlegender Ansatz sollte entweder zeichenorientierte Eingang oder leitungsorientierten eingegeben wird, eine Datei in ein Array zu lesen. Die einfachere oder die zwei wären wahrscheinlich Zeile-orientierte Eingabe, wo Sie eine ganze Zeile lesen würden und dann tokenize die Zeile in separate Wörter mit strtok (oder mit einem Start- und Ende-Zeiger, um jede Zeile zu gehen, nachdem es ist Lese trennende Wörter).

Machen Sie einen Stich auf Ihre gewählte Methode und schreiben Sie zurück, wenn Sie nicht weiterkommen. Wir helfen gerne.

Ein kurzes Beispiel für die Verwendung von fgets zum Lesen jeder Zeile gefolgt von strtok, um jede Zeile in Wörter zu trennen, könnte etwas Ähnliches wie folgt sein. note: das Programm wird aus dem Dateinamen in der Befehlszeile angegeben gelesen (oder von stdin standardmäßig, wenn kein Name angegeben wird)

#include <stdio.h> 
#include <string.h> 

enum {MAXC = 1000}; 

int main (int argc, char **argv) { 

    char buf[MAXC] = ""; 
    char *delims = " \t\n.,:;"; /* word separators for strtok */ 
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin; 

    if (!fp) { /* always validate file is open for reading */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 

    while (fgets (buf, MAXC, stdin)) { /* read each line into buf */ 
     char *p = buf; 
     printf ("\n line: %s\n tokens:\n", buf); 
     /* tokenize buf into words with strtok */ 
     for (p = strtok (buf, delims); p; p = strtok (NULL, delims)) 
      printf (" %s\n", p); 
    } 
    if (fp != stdin) fclose (fp); /* close if not reading stdin */ 

    return 0; 
} 

Beispiel Eingabe

$ cat dat/captnjack.txt 
This is a tale 
Of Captain Jack Sparrow 
A Pirate So Brave 
On the Seven Seas. 

Beispiel/Output

$ ./bin/strtok_fgets_file <dat/captnjack.txt 

line: This is a tale 

tokens: 
    This 
    is 
    a 
    tale 

line: Of Captain Jack Sparrow 

tokens: 
    Of 
    Captain 
    Jack 
    Sparrow 

line: A Pirate So Brave 

tokens: 
    A 
    Pirate 
    So 
    Brave 

line: On the Seven Seas. 

tokens: 
    On 
    the 
    Seven 
    Seas 
1

Nur fgetc und putchar, da Sie lesen Zeichen-Zeichen

int c; 
while ((c = fgetc(fp)) != EOF) 
    putchar(c); 

Überprüfen Sie auch den Rückgabewert von fopen. Bei einem Fehler wird NULL zurückgegeben.

+0

Da das Ziel darin besteht, die Datei in ein Array von 'char' zu lesen, ist das in der Frage gezeigte Drucken wahrscheinlich nur eine Diagnoseüberprüfung (eine gute Idee) .Das vermisst das Problem mit dem Code in der Frage , das wurde [richtig angezeigt] (https://stackoverflow.com/questions/37105074/reading-a-text-file#comment61752805_37105074) von [user3078414] (https://stackoverflow.com/users/3078414/user3078414) –

2

Ihr Code hat einen logischen Fehler, der es kaputt macht - sehr einfach zu beheben.

  • Ihre for-Schleife hat leer Körper - das ist, warum es nur das erste Zeichen druckt. Semikolon gelöscht.

Es gibt auch einen Stil Ausgabe den Wert des Zählers bei der Prüfung:

  • Obwohl i gegen nicht Überprüfung 100 wird nicht in der Code machen scheitern, wenn alles andere in Ordnung ist, Es ist üblicher und entspricht Ihrer Aufgabenspezifikation, um seinen Wert für weniger als100 zu überprüfen, oder welche Konstante Sie wollen.

Obwohl dies nicht der eleganteste Weg, eine solche Aufgabe zu vollenden sein kann, ist es eine Nachbesserung des Lese-für-Zeichen-Methodencode:

#include <stdio.h> 

int main(void) 
{ 
FILE *wse; 
char a[1000]; 
int i; 

    if((wse=fopen("3.txt","r")) == NULL)//always check for file errors! 
     return 1; 

    for(i=0 ; i<100 ; i++) 
    { 
     if(fscanf(wse,"%c",&a[i]) != 1) //check against end of file! 
      break; 
     printf("%c",a[i]); 
    } 
    fclose(wse); 
return 0; 
} 
+0

@chux - dein Vorschlag ist sehr wertvoll - ich habe meine Antwort verbessert - danke! – user3078414

1

finden Sie den korrigierten Code:

FILE *wse; 
char a[1000]; 
int i=0; 

wse=fopen("21e.txt","r"); 

while(fscanf(wse,"%c",&a[i]) == 1) 
{ 
    printf("%c",a[i]); 
    i++; 
} 

Zuerst habe ich den Code korrigiert, indem Sie Ihr Semikolon nach der for-Schleife entfernen. Und zweitens, ersetzt mit while-Schleife, so dass es bis zum Ende der Datei liest. Wenn die Schleife EOF (End Of File) kreuzt, kann es zum Absturz kommen.