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
    000080079

    Problem: 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 nicht 😕

    Hoffe 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.


Anmelden zum Antworten