erzeugte Datei zu groß

xargon

Mitglied
Hi!
Folgendes Problem:
Ich habe ein Int-Array mit sagen wir mal 200 Elementen.
Wenn ich dieses Array nun in eine Datei schreibe , müsste diese ja 800 Byte groß sein, allerdings ist die Datei immer nen bissl größer so um 1-5 Bytes.
Also bis ca. 174 Elementen funktioniert alles super, aber wenn ich mehr Elemente einsetze, kommt es zu dieser Situation!
Wenn ich die Datei dann zum Beispiel mit folgendem Code auslese

Code:
    for(int x=0;x<200;x++)
    {
    fseek(dat,x*sizeof(int),SEEK_SET);
    fread(&test,sizeof(int),1,dat);
    cout<<test<<"\n";
    }

dann zeigt der mir ganz viele falsche Werte an!
Könnten diese zusätzlichen Bytes vielleicht irgendwelche Steuerzeichen sein?
Wenn ja, warum kommen diese erst ab einer bestimmten Größe des Arrays?
 
Ich bin mir nicht sicher, was für einen Fehler du da hast, aber jedenfalls ist die Zeile mit dem fseek überflüssig und eher schädlich. Du positionierst mit fseek() den Filepointer, also die Stelle, wo als nächstes gelesen wird. Da erledigt aber fread() auch schon für dich. Nach jedem Lesevorgang ist der Filepointer um die entsprechende Anzahl BYtes weitergerückt, und da die Daten ja hintereinander in der Datei stehen, befindet sich der Filepointer bereits an der richtigen Stelle, um den nächsten Eintrag zu lesen.

Übrigens, wenn ich drüber nachdenke, positionierst du den Filpointer mit fseek() anscheinend hinter das letzte Integer und liest vermutlich ein EOF. Es ist ungünstig, im Code davon auszugehen, dass eine Datei tatsächlich 200 ints enthält. Du solltest in deiner Schleife noch prüfen, ob das Dateiende vorzeitig errreicht wird und dann abbrechen.
Probier das mal (ich habe es allerdings nicht getestet):

Code:
int test  = 0;
int x     = 0;
int count = 0;

while( !feof( dat ) )
{
  count = fread(&test,sizeof(int),1,dat);

  if( ferror( dat ) )      
  {
    cout << "Read error\n";
    break;
  }

  x += count;
  cout<< test << ", " << count << "\n";

}
 
hmm, das ist merkwürdig...
x ist immer unterschiedlich groß!
(hier sollte ich vielleicht erwähnen, dass bei jeweils jedem programmstart eine neue datei erstellt wird, mit einem neuen array aus zufallszahlen)
 
Zuletzt bearbeitet:
achja, eine weitere Beobachtung:

Ich habe ein ähnliches Programm unter Linux geschrieben, und da läuft alles supi!
Datei ist immer so gross wie erwartet, obwohl der Code zum erzeugen der Datei und hineinschreiben des Arrays in die Datei äquivalent zum Windows Code ist.
 
hier der code zum schreiben (achja: i ist const int und gibt die größe des arrays an):

Code:
srand(GetTickCount());

    for(int x=0;x<i;x++)
    {
    arry[x]=rand()%1000;
    }

dat=fopen("data.dat","w");
fwrite(arry,sizeof(int),i,dat);
fclose(dat);

so, danach räume ich das array erstmal auf:

Code:
 for(int x=0;x<i;x++)
    {
    arry[x]=0;
    }

so, dann mein code zum auslesen:

Code:
dat=fopen("data.dat","r");
    fread(arry,sizeof(int),i,dat);
    for(int x=0;x<i;x++)
    {
    cout<<arry[x]<<"\n";
    }
fclose(dat);

dein code zeigt bei mir zwar irgendwelche zahlen an, aber auf gar keinen fall das komplette array, der bricht vorher immer ab.
ich will mal ganz vorsichtig fragen: könnte es irgendwie mit meinem OS zusammenhängen? (hab Windows ME)
wie gesagt, unter linux läuft alles supi.
 
Ich muss gestehen, dass ich nicht weiss, wo der Fehler liegt. Dein Code (bzw. das, was du uns sehen lässt) scheint soweit okay zu sein. Er sollte unter Windows ebenso laufen wie unter Linux.

Vielleicht hat sonst noch jemand eine Idee?
 
Ich könnte mir denken, dass du die beiden fopens beim Schreiben und Lesen mit dem Binär-"Flag" versehen musst. Also "wb" und "rb". Sonst werden dir vermutlich irgendwo Zeilenumbrüche reinformatiert.
 
Wenn er fwrite() und fread() so verwendet, wie ich das seinem Code entnehme, sollte das eigentlich keine Rolle spielen, da er byteweise schreibt/liest und nicht formatiert. Oder? Ganz sicher bin ich nicht.
 
nee, formatieren tue ich da nichts.
könnte mir vielleicht jemand erklären was es mit diesem binary flag auf sich hat?
 
Zurück