Werte aus Textdatei in 2D-Matrix speichern
-
Hallo Leute,
ich versuche Werte(int) aus einer Textdatei zu lesen und in eine 2D Matrix zu speichern.
Hier der Code:int main(void) { FILE *fp = NULL; int matrix[9][9]; int i,j,z; fp = fopen("test.txt","r"); if(fp==NULL) { printf("Fehler beim Oeffnen!\n"); } while( (z = getc(fp)) != EOF ) { printf("|-|-|-|-|-|-|-|-|-|\n"); for(i=0; i<9; i++) { for(j=0; j<9; j++) { z = fgetc(fp); printf("|%c",z); matrix[i][j] = z; } } printf("\n"); printf("|-|-|-|-|-|-|-|-|-|\n"); } fclose(fp); return 0; }
Die Textdatei sieht so aus:
530070000
600195300
098000060
800060003
400803001
700020006
060000280
000419005
000080079Problem: Er liest die Werte zwar ein, gibt sie auch aus. Allerdings, vergisst er die 5 am anfang?! Diese erscheint dann ziemlich am Ende.
Ich wollte eine einfache Tabelle darstellen, wo die Werte drin stehen. Sehe leider meinen Fehler nichtHoffe ihr könnt mir Helfen!
Danke.
Gruß
Manda
-
Hi,
lass doch die while Schleife, die deine erste Zahl verschluckt, einfach weg.
Ca. so:for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { z = fgetc ( fp ); if ( z == EOF ) { i = 10; break; } printf ( "|%c", z ); matrix[i][j] = z; } }
Gruß,
B.B.
-
Hallo B.B (lange nichts gehört/gelesen) Danke erstmal!
Irgendwie lässt er so die letzte Zeile komplett weg. Er nimmt nur die 0 von der letzten Zeile und den rest nicht.So etwa(Ergebnis):
|5|3|0|0|7|0|0|0|0|
|6|0|0|1|9|5|3|0|0|
|0|9|8|0|0|0|0|6|0|
|8|0|0|0|6|0|0|0|3|
|4|0|0|8|0|3|0|0|1|
|7|0|0|0|2|0|0|0|6|
|0|6|0|0|0|0|2|8|0|
|0|0|0|4|1|9|0|0|5|0 Press any key to continue
-
Problem hat sich erledigt. Lag nur an der for-schleife. Jetzt kriege ich alle Werte.
Danke.
-
Vielleicht sind in deiner Datei noch irgendwelche Leerzeichen oder so?
-
Entschuldigt wenn ich das Thema wieder aufgreife. Ich versuche nun die Werte die in der Matrix stehen (sollten) auszugeben.
Textdatei sieht so aus: (siehe alten post - ohne leerzeichen)Code zum einlesen:
void main(void) { FILE *fp = NULL; int matrix[9][9]; int i,j,z; fp = fopen("test.txt","r"); for ( i=0; i<10; i++ ) //Hier muss ich auch bis 10 laufen um ALLE Werte zu kriegen { for ( j=0; j<10; j++ ) { z = fgetc ( fp ); if ( z == EOF ) { i = 10; break; } printf ( "|%c", z ); //1. Ausgabe ist ok! matrix[i][j] = z; } } //gleich danach die Ausgabe: for(i=0; i<9; i++) { for(j=0; j<9; j++) { printf(" |%d ", matrix[i][j]);//2. Ausgabe leider andere Werte } printf("\n"); } }
1.Ausgabe ist korrekt
2.Ausgabe gibt leider ganz andere Werte aus.Liegt es vielleicht an dem " %c " beim einlesen? Da ich ein Zeichen einlese und in eine int matrix speichere?
Speichern wollte ich sie eigentlich auch gerne in die int matrix.Gruß
Manda
-
Wenn beide Ausgaben gleich sein sollen, dann sollten beide Ausgaben auch die gleiche "Formatierung" haben:
printf ( "|%c", z ); // 1. Ausgabe ist ok! // printf (" |%d ", matrix[i][j]); printf ("|%c", matrix[i][j]); // 2. Ausgabe
-
@+gjm+ - das ging ja fix. Danke.
Kurze Verständnis frage noch. Die Werte wären aber als int gespeichert oder?
Und warum muss ich in der for-Schleife bis 10 laufen, obwohl es immer nur 9 Werte pro Zeile sind?for(i=0; i<10; i++) //warum bis 10? und nicht bis <9?
Wenn ich bis <9 laufe, dann nimmt er von der letzten Zeile nur den 1.Wert (hier die 0) und den Rest lässt er aus.
Gruß
Manda
-
MandaJohn schrieb:
Die Werte wären aber als int gespeichert oder?
Jep. Das Zeichen "5" wird gespeichert als int 53 usw. (siehe ASCII).
MandaJohn schrieb:
Und warum muss ich in der for-Schleife bis 10 laufen, obwohl es immer nur 9 Werte pro Zeile sind?
Das Einlesen enthält noch einen üblen Bug. Das Problem ist die "test.txt".
Wenn die Zeichen in der Datei (schön unübersichtlich) in einer Reihe stehen:530070000600195300098000060 ...
dann reicht:
for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { z = fgetc ( fp ); printf ( "|%c", z ); //1. Ausgabe ist ok! matrix[i][j] = z; } printf ( "|\n"); // <- Absatz 'anzeigen' }
Wenn sie aber (schön übersichtlich) Absätze enthält:
530070000 600195300 098000060 ...
dann liest (einfach gesagt) fgetc() das "Zeichen" für "Absatz" mit ein.
Da aber der Index bis <10 läuft, wird der Absatz zwar angezeigt, aber im matrix-Array wieder überschrieben.