problem beim einlesen einer binärdatei
-
Hi Leute!
Also irgendwie klappt es bei mir noch nicht so richtig meine Binärdatei wieder einzulesen.
und zwar speichere ich folgendermaßen daten in einer neuen datei:
FILE *f = fopen((char*)dateiname, "wb"); fwrite(&spalten,1,sizeof(int),f); fwrite(&zeilen,1,sizeof(int),f); for (int i=0; i < (zeilen*spalten); i++) { fwrite(&feld[i],1,sizeof(char),f); } fclose(f);dann habe ich versucht das ganze folgendermaßen wieder einzulesen:
int dat,i=0,; unsigned char binptr[1]; FILE *f = fopen("test.txt", "rb"); while ((dat = getc(f)) != EOF) { cout << dat << endl; i++; } cout << endl << i; fclose(f);aber irgendwie stimmt das ganze nicht so ganz. vorallem sind die ersten beiden zeilen, in der ja eigentlich die zeilen und spalten stehen leer. irgendwie alles komisch. zeilen und spalten sind normale int variablen. das feld ein eindimensionales array.
danke schonmal!
liebe grüße
-
mit fgetc() liest du nur ein byte ein ( fgetc() gibt zwar ein int zurück aber nur damit es EOF darstellen kann ).
verwende fread()
Kurt
-
ähm, okay
danke, aber wie mach ich das, könntest du mir da kurz behilflich sein? also die int werte die er mir zurück gibt stimmen. nur hab cih das gefühl es fehlt was.
-
ViperNeo schrieb:
ähm, okay
danke, aber wie mach ich das, könntest du mir da kurz behilflich sein? also die int werte die er mir zurück gibt stimmen. nur hab cih das gefühl es fehlt was.Dann zeig her wie du das machst.
Kurt
-
Das ist meine ganze Editor funktion:
int leditor(bool load=false) { int x = 1, y = 1; char taste; bool ende = false; int zeilen = 10, spalten = 10; char dateiname[50]; //ZEICHEN char mauer = 219; char leer = 0; char futter = 6; char sfutter = 6; //!ZEICHEN if (load==true) { /*char datei[50]; cout << "Dateiname der zu ladenden Datei: "; cin.getline(datei, 49); FILE *f = fopen((char*)datei, "r"); //LADEVORGANG ??? fclose(f); system("cls");*/ } else { cout << "Zeilenzahl: "; cin >> zeilen; cout << "Spaltenzahl: "; cin >> spalten; cout << "Dateiname: "; cin >> dateiname; } char *feld = new char [zeilen*spalten]; system("cls"); SetConsoleTitle("Ultimate PACMAN - Leveleditor"); system("COLOR 1F"); if (load==true) { //LOAD } else { for (int i=0; i < zeilen; i++) { for (int k=0; k < spalten; k++) { if (i==0 || i==zeilen-1 || k==0 || k==spalten-1) { feld[(i*spalten)+k] = mauer; } else { feld[(i*spalten)+k] = leer; } cout << feld[(i*spalten)+k]; } cout << endl; } } gotoxy(x,y); do { taste = getch(); if (!kbhit()) { switch (taste) { //Leere einfügen case 'l': { feld[(y*spalten)+x] = taste; cout << leer; gotoxy(x,y); break; } //Futter einfügen case 'f': { feld[(y*spalten)+x] = taste; cout << futter; gotoxy(x,y); break; } //Mauer einfügen case 'm': { feld[(y*spalten)+x] = taste; cout << mauer; gotoxy(x,y); break; } //Ende und speichern case 27: { ende = true; break; } //Pfeiltaste nach oben case 72: { y--; if (y < 0) { y = 0; } gotoxy(x,y); break; } //Pfeiltaste nach rechts case 77: { x++; if (x > spalten-1) { x = 0; y++; } if (y > zeilen-1) { y = zeilen-1; } gotoxy(x,y); break; } //Pfeiltaste nach unten case 80: { y++; if (y >= zeilen-1) { y = zeilen-1; } gotoxy(x,y); break; } //Pfeiltaste nach links case 75: { x--; if (x < 0) { x = spalten-1; y--; } if (y < 0) { y = 0; } gotoxy(x,y); break; } } } } while (ende!=true); system("cls"); cout << "Datei wird gespeichert... (" << dateiname << ")" << endl; FILE *f = fopen((char*)dateiname, "wb"); fwrite(&spalten,1,sizeof(int),f); fwrite(&zeilen,1,sizeof(int),f); for (int i=0; i < (zeilen*spalten); i++) { fwrite(&feld[i],1,sizeof(char),f); } fclose(f); cout << "Datei erfolgreich gespeichert." << endl; cout << "Weiter mit beliebiger Taste." << endl; getch(); return 0; }Das ist der Ausschnitt indem ich die Zeilen und SPaltenzahl sowie das eindimensionale Array feld[] in eine datei speichere:
FILE *f = fopen((char*)dateiname, "wb"); fwrite(&spalten,1,sizeof(int),f); fwrite(&zeilen,1,sizeof(int),f); for (int i=0; i < (zeilen*spalten); i++) { fwrite(&feld[i],1,sizeof(char),f); } fclose(f);nun fehlt mir eben noch eine routine mit der ich die daten die ich in die datei schreibe wieder auslese und wieder den variablen zeile, spalte und in das array lese um wieder damit zu arbeiten.
aktuell habe ich in einem anderen projekt um das laden von binärdateien zu testen folgendes gemacht:
int dat,i=0,; unsigned char binptr[1]; FILE *f = fopen("test.txt", "rb"); while ((dat = getc(f)) != EOF) { cout << dat << endl; i++; } cout << endl << i; fclose(f);da hab ich allerdings das gefühl es fehlt irgendwie, irgendwas. vorallem da die ersten zeilen für zeile und spalte 0 sind???
-
Wie schon gesagt mit getc() gehts nicht (oder nicht so einfach ) das liest nur ein byte ( sehe gerade habe in meinem obigen posting von fgetc() gesprochen aber das ist sowieso das gleiche ). mit fread() geht's wie das schreiben.
Kurt
-
wie meinst du das wie das schreiben? kannst du mir ein beispiel nennen?
-
FILE *f = fopen((char*)dateiname, "rb"); int spalten, zeilen; char * feld; fread(&spalten,1,sizeof(int),f); fread(&zeilen,1,sizeof(int),f); feld = new char[spalten*zeilen]; fread(feld,zeilen*spalten,sizeof(char),f); fclose(f);So müsste es gehen. Ich sehe aber geradee dass ich dich vermutlich verwirrt habe. Bin nämlich die ganze zeit davon ausgegangen das feld ein array von ints ist. Bei array of char funktioniert natürlich fgetc() oder getc() in einer schleife genausogut
Kurt