2017-02-15 18 views
0

Ich habe eine Textdatei der Größe 8 durch 12 (8 Zeilen, 12 Spalten) (x, y)Lese in einer Textdatei in einen 2D-Array in C

abcdefghjikl 
123456789abc 
aerereghjikl 
123456789abc 
abc43434dfdf 
12erere789ab 
abcdefghjikl 
12345fdfd89a 

Ich versuche, jeden zu lesen einzelnes Zeichen in ein 2D-Array, wobei die erste Dimension die Zeilen und die zweite die Spalten sind. Diese

ist, was ich habe versucht:

int main(void) { 
    FILE * fp; 
    fp = fopen("test.txt","r"); 

    char points[8][12]; 
    int i,j; 

    for(i=0; i<8; i++) { 
     for(j=0; j<12; j++) { 
      fscanf(fp,"%c",&points[i][j]); 
     } 
    } 

    for(i=0; i<8; i++) { 
     for(j=0; j<12; j++) { 
      printf("%c",points[i][j]); 
     } 
    } 

    return 0; 
} 

Allerdings scheint meine Ausgabe richtig zu arbeiten, bis, bis die letzte Zeile der Datei.

abcdefghjikl 
123456789abc 
aerereghjikl 
123456789abc 
abc43434dfdf 
12erere789ab 
abcdefghjikl 
12345 

Wo die letzte Zeile nicht vollständig funktioniert. Ich habe versucht, die Array-Dimensionen der Zeile zu erhöhen, wodurch die letzte Zeile angezeigt wird, aber meiner Ausgabe Garbage-Werte hinzugefügt werden. Jede Hilfe würde sehr geschätzt werden.

+4

Es gibt ein '\ n' in jeder Zeile, das Sie in Ihr Array einfügen. –

+1

Überprüfen Sie den Rückgabewert von 'fopen()', 'fscanf()' ... –

+0

Sie können das '\ n' mit 'fseek' am Ende der Ausführung der inneren Schleife überspringen. –

Antwort

5

Newline-Zeichen, wie der Name schon sagt, sind auch Zeichen. Sie sollten es als verdächtig empfinden, dass Ihre Ausgabe Zeilenumbrüche enthält.

Es gibt tatsächlich 13 Zeichen in jeder Zeile der Datei (unter der Annahme eines Unix-Systems). Die zwölf druckbaren und eine Zeilenschaltung.

Also für i = 1 ... 7 das erste Zeichen in jeder "Zeile" ist ein Newline.

Zum Glück kann scanf angewiesen werden, Leerraumzeichen zu überspringen, wenn auf eine Zeicheneingabe gewartet wird. Fügen Sie einfach einen Raum, in dem Anfang des Formatbezeich string:

fscanf(fp, " %c", &points[i][j]); 
+0

Wenn Sie strtok() für das Array direkt nach dem scanf verwenden, um das Zeilenumbruchzeichen zu entfernen, erhalten Sie die gleiche Ausgabe. – erefeofkeo

+0

@erefeofkeo - 'strtok' ist ein Vorschlaghammer. Dies ist ein Job für einen Schraubenzieher – StoryTeller

3

Hinweis: Sie 7 Zeichen fehlen, die die Anzahl der \n im Array gesetzt ist.

abcdefghjikl \n 
123456789abc \n 
aerereghjikl \n 
123456789abc \n 
abc43434dfdf \n 
12erere789ab \n 
abcdefghjikl \n 
12345 

Es gibt eine \n am Ende jeder Zeile. Was für Sie nicht sichtbar ist, aber in einem Array gespeichert wird.

Sie können dies einfach überspringen, indem Sie dem Dateizeiger mitteilen, dass er 1 Zeichen überspringen soll.

for(i=0; i<8; i++) { 
    for(j=0; j<12; j++) { 
     fscanf(fp,"%c",&points[i][j]); 
    } 
    fseek(fp, 1, SEEK_CUR); 
} 

Ausgang:

abcdefghjikl 
123456789ab 
aerereghjik 
123456789ab 
abc43434dfd 
12erere789a 
abcdefghjik 
12345fdfd89 
0

sollten Sie prüfen, ob Schleppzeiger von fp, die Datei, um sicherzustellen, wurde korrekt geöffnet. Etwas wie das ist, was Sie tun müssen:

FILE * fp; 
fp = fopen("test.txt","r"); 
if (fp == NULL) { 
    /* handle exit */ 

Wie für Sie die letzte Zeile der Datei Fehler betreffend, müssen Sie diesen segement ändern:

for(i=0; i<8; i++) { 
    for(j=0; j<12; j++) { 
     fscanf(fp,"%c",&points[i][j]); 
    } 
} 

An:

for(i=0; i<8; i++) { 
    for(j=0; j<12; j++) { 
     if (fscanf(fp,"%c ",&points[i][j]) != 1) { 
      fprintf(stderr, "Non character found.\n"); 
      return 1; 
     } 
    } 
    printf("\n"); 
} 

Überspringt eine beliebige Anzahl von nachgestellten Leerraum von fscanf(). fscanf() wird ein Newline-Zeichen im Eingabepuffer belassen und wird beim nächsten Aufruf fscanf() übertragen. Es ist auch sicher zu überprüfen, dass 1 Zeichen gelesen wurde.