[C++] Integer von Datei in Mehrdimensionalen Array lesen

Z

zAD

Gast
Hi,

ich habe eine bestimmte Anzahl von Zahlen in einer .txt Datei und möchte diese in einen mehrdimensionalen Array lesen.

mein code sieht derzeit so aus:

Code:
FILE *stream;
int   liste[10][10];
int   x,y;

if ( (stream = fopen("datei.txt", "r")) != NULL)
{
     for(x=0;x<10;x++)
          for(y=0;y<10;y++)
               fread(&(liste[x][y]), sizeof(int), 1, stream);
    fclose(stream);
}
else
    printf("Fehler: Datei existiert nicht");

Wenn ich dann aber die Werte von liste[][] ausgeben lasse, bekomme ich falsche Werte angezeigt (viel zu hoch - 9 stellig).

Ich bin mir zwar sicher, dass es am 1. parameter der fread Funktion liegt, habe aber nicht gefunden wie es richtig heißen müsste

mfg zad
 
Der Thread-Prefix [C] hätte wohl eher gepasst :)

Wie stehen die Zahlen in der Datei? Ganz normal als Text, oder binär? Deine jetztige Einlesefunktion arbeitet nämlich nur binär. Ansonsten sieht es erstmal okay aus. Du solltest aber den Rückgabewert von fread überprüfen.
 
die zahlen stehen im textmode, aber auch bei

fopen("datei.txt", "r+t");

ändert sich nichts.
die datei liest er auch ein, sonst würde er einen fehler ausgeben.

hier mal der ganze code:
Code:
#include <iostream>


int main() 
{

FILE *stream;
int   liste[3][3];
int   x,y;

if ( (stream = fopen("datei.txt", "rt")) != NULL)
{
     for(x=0;x<3;x++)
          for(y=0;y<3;y++)
               fread(&(liste[x][y]), sizeof(int), 1, stream);
    fclose(stream);
}
else
    printf("Fehler: Datei existiert nicht");

for(x=0;x<3;x++)
	for(y=0;y<3;y++)
		printf("%d \n", liste[x][y]);
    
}

und der output:
Code:
875770417
943142453
842084409
909456435
809056311
-858993460
-858993460
-858993460
-858993460
Press any key to continue

wobei die datei so aussieht:
Code:
12345678901234567890
 
Jo, das kann so nicht funktionieren =) Fehler beim Einlesen gibt es ziemlich fix, die werden allerdings nicht abgefangen und Du siehst sie garnicht.

Folgendes macht Dein Progamm:

Es liest (vermutlich - der C-Standard legt es aber nicht fest) 4 Bytes ein, die ASCII-Werte 1, 2, 3 und 4 und wandelt ihre binäre (!) Repräsentation in einen int um. Deshalb kann es nicht funktionieren.

Eine Lösung an dieser Stelle ist schon etwas schwieriger... wieviele Ziffern gehören denn zu einer Zahl?
 
die zahlen werden nicht größer als 9, also jedes feld / jede zahl sollte dann eine ziffer haben.
 
So sollte es schonmal gehen.

Code:
if ( (stream = fopen("datei.txt", "r")) != NULL)
{
     for(x=0;x<10;x++)
          for(y=0;y<10;y++)
          {
               char c;
               fread(&c, 1, 1, stream);
               if ((c >= '0') && (c <= '9')
                   liste [x][y] = c - '0';
          }
    fclose(stream);
}
else
    printf("Fehler: Datei existiert nicht");
 
hmm das gibt einen speicherlesefehler.

muss man den char nicht erst in einen int umwandeln?
 
wenn die zahlen im als text drinstehen, dann schau dir mal die doku zu fscanf an. (man fscanf)
außerdem sollte auch den rückgabewert von fread bzw. fscanf im auge behalten, sonst könnte man über das ende der datei hinaus lesen. :)
 
Auf die Fehlerprüfung hatte ich gerade mal in der Eile verzichtet (musste wech ;) )

Code:
FILE *stream;
int   liste[10][10];
int   x,y;

if ( (stream = fopen("datei.txt", "r")) != NULL)
{
     for(x=0;x<10;++x)
          for(y=0;y<10;++y)
          {
               char c;
               if (fread(&c, 1, 1, stream) != 1)
               {
                   printf ("Lesefehler\n");
                   fclose(stream);
                   return; // ein break geht hier nicht, weil es 2 verschachtelte schleifen sind
               }

               if ((c >= '0') && (c <= '9'))
                   liste [x][y] = c - '0'; // das konvertiert den ascii-wert
               else
               {
                   printf ("Lesefehler\n");
                   fclose(stream);
                   return; // ein break geht hier nicht, weil es 2 verschachtelte schleifen sind
               }
          }
    fclose(stream);
}
else
    printf("Fehler: Datei existiert nicht");
 
also ich habs nun über fstreamf gemacht, klappt auch super.


danke für die hilfe :*)
 
Zurück
Oben