Binärdatei einlesen und überschreiben

Als Neuling in der C/C++ Programmierung habe ich noch folgendes Problem: Ein Programm muss Binärdateien Blockweise (char-array) einlesen und ausgeben. Wie muss ich das einlesen und ausgeben machen?
MfG,Stefan

Hallo Stefan,

Als Neuling in der C/C++ Programmierung habe ich noch
folgendes Problem: Ein Programm muss Binärdateien Blockweise
(char-array) einlesen und ausgeben. Wie muss ich das einlesen
und ausgeben machen?

Vielleicht sollte man erstmal einen Block (char-Array)
definieren:

 #define BLOCKSIZE 1024
 ...
 char block[BLOCKSIZE];

und eventuell Dateinamen bestimmen:

 const char in\_name [] = "input.dat";
 const char out\_name[] = "output.dat";

dann Dateien zum Einlesen und Ausgeben öffnen:

 #include 
 ...
 FILE \*infile, \*outfile;
 ...
 infile = fopen(in\_name, "rb");
 outfile = fopen(out\_name, "wb");

(z.B. http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/…)

Dann könnte man in einer Schleife was lesen
und evtl. schreiben:

 ...
 nbytes = fread(block, BLOCKSIZE, 1, infile);
 /\*
 hier haben wir einen Block von 'char'
 im array block[], mit dem wir was
 anstellen koennen
 \*/
 if( nbytes \> 0 ) 
 fwrite(block, nbytes, 1, outfile); 
 ...

(z.B. http://www2.fh-fulda.de/~klingebiel/c-stdlib/stdio.h…)
und am Ende wieder zumachen:

 ...
 fclose(infile);
 fclose(outfile);
 ...

Vielleicht bekommst Du es ja jetzt hin?

Grüße

CMБ

Hallo,
Zu deiner Antwort habe ich noch 2 Fragen:
Was hat die 1 in

nbytes = fread(block, BLOCKSIZE, 1, infile);

und

fwrite(block, nbytes, 1, outfile);

zu bedeuten?
Außerdem soll „infile“ und „outfile“ die selbe Datei sein. Das muss man doch sicher etwas anders regeln, oder?
Gruß, Stefan

Hallo Stefan

Zu deiner Antwort habe ich noch 2 Fragen:
Was hat die 1 in

nbytes = fread(block, BLOCKSIZE, 1,
infile);

und

fwrite(block, nbytes, 1, outfile);

zu bedeuten?

Die Syntax von fread/fwrite ist:
‚block‘ -> Speicheradresse des Blocks
‚nbytes‘ -> Größe des Blocks gelesener Bytes
‚ncount‘ -> Anzahl der Blöcke der Größe ‚nbytes‘
‚filep‘ -> Zeiger auf das Dateiobjekt

Außerdem soll „infile“ und „outfile“ die selbe Datei sein. Das
muss man doch sicher etwas anders regeln, oder?

Das macht man nicht. Das geht zwar über:
(fopen: http://www.cplusplus.com/ref/cstdio/fopen.html)

 #include 
 ...
 FILE \*iobfile;
 ...
 iobfile = fopen(f\_name, "r+b");
 nbytes = fread(block, BLOCKSIZE, 1, iobfile);
 ...
**rewind** ( **iofile** ); /\* Datei an den Anfang setzen und Puffer leeren \*/
 ...
 fwrite(block, nbytes, 1, iobfile); 
 ...

(rewind: http://www.cplusplus.com/ref/cstdio/rewind.html)

Man würde lieber eine neue Datei öffnen,
in diese schreiben (aus der alten lesen)
und nachdem alles o.k. ist (fclose), die alte
Datei mit

 unlink(in\_name);
 rename(out\_name, in\_name);

löschen und der Neuen den Namen der Alten verpassen, siehe:
(rename: http://www.delorie.com/djgpp/doc/libc/libc_662.html)
(unlink: http://www.delorie.com/djgpp/doc/libc/libc_839.html)

Grüße

CMБ

Hallo Semjon,
Erstmal danke, du hast mir schon sehr geholfen, aber so ganz funktioniert es noch nicht. Bei mir(Mac OS X) wird die Fehlermeldung „Segmentation fault“ angezeigt.
Hier der Code:

#define blocklaenge 2048

typedef struct{
 char Text[blocklaenge];
 int Laenge;
}Textblock;

typedef struct{
 char Zeichen[512];
}string;
…
 FILE \*FDatei\_alt;
 FILE \*FDatei\_neu;
 Textblock Block\_alt;
 Textblock Block\_neu;
 FDatei\_alt=fopen(Datei.Zeichen,"rb");
 printf("Quelldatei geöffnet\n");
 FDatei\_neu=fopen(Datei\_neu.Zeichen,"wb");
 printf("Zieldatei geöffnet\n");
 do{
 Block\_alt=Datei\_lesen(FDatei\_alt);
 …
 Datei\_schreiben(FDatei\_neu,Block\_neu);
 }while(Block\_alt.Laenge==blocklaenge);

Textblock Datei\_lesen(FILE \*Datei){
 Textblock Text;
 int Ganzer\_Block;
 int Position;
 char Zeichen;
 Ganzer\_Block=fread(Text.Text,blocklaenge,1,Datei);
 if(Ganzer\_Block=1){
 Text.Laenge=blocklaenge;
 }else{
 do{
 Zeichen=Text.Text[Position];
 Position++;
 }while(Zeichen!=0);
 Text.Laenge=Position;
 }
 return Text;
}

void Datei\_schreiben(FILE \*Datei,Textblock Text){
 fwrite(Text.Text,blocklaenge,1,Datei);
}//Hab das erst anders regeln wollen, darum ein einzeiler

Nach „Zieldatei geöffnet“ kommt die Fehlermeldung
Gruß, Stefan

Hallo Semjon,
Erstmal danke, du hast mir schon sehr geholfen, aber so ganz funktioniert es noch nicht. Bei mir(Mac OS X) wird die Fehlermeldung „Segmentation fault“ angezeigt.
Hier der Code:

#define blocklaenge 2048

typedef struct{
 char Text[blocklaenge];
 int Laenge;
}Textblock;

typedef struct{
 char Zeichen[512];
}string;
…
 FILE \*FDatei\_alt;
 FILE \*FDatei\_neu;
 Textblock Block\_alt;
 Textblock Block\_neu;
 FDatei\_alt=fopen(Datei.Zeichen,"rb");
 printf("Quelldatei geöffnet\n");
 FDatei\_neu=fopen(Datei\_neu.Zeichen,"wb");
 printf("Zieldatei geöffnet\n");
 do{
 Block\_alt=Datei\_lesen(FDatei\_alt);
 …
 Datei\_schreiben(FDatei\_neu,Block\_neu);
 }while(Block\_alt.Laenge==blocklaenge);

Textblock Datei\_lesen(FILE \*Datei){
 Textblock Text;
 int Ganzer\_Block;
 int Position;
 char Zeichen;
 Ganzer\_Block=fread(Text.Text,blocklaenge,1,Datei);
 if(Ganzer\_Block=1){
 Text.Laenge=blocklaenge;
 }else{
 do{
 Zeichen=Text.Text[Position];
 Position++;
 }while(Zeichen!=0);
 Text.Laenge=Position;
 }
 return Text;
}

void Datei\_schreiben(FILE \*Datei,Textblock Text){
 fwrite(Text.Text,blocklaenge,1,Datei);
}//Hab das erst anders regeln wollen, darum ein einzeiler

Nach „Zieldatei geöffnet“ kommt die Fehlermeldung. Kann mir jemand helfen?
Gruß, Stefan

‚Segmentation fault‘=Arrayproblem
Hallo
erstmal möchte ich mich entschuldigen,dass das letzte zweimal auf der Seite gelandet ist.
Zu meinem Problem: „segmentation fault“ wird ausgegeben, wenn es einen internen Fehler bei der Verwendung von Arrays gibt. Damit ist das Programm fertig und läuft perfekt.
Viele Grüße an alle, Stefan