Ich versuche, Code zu schreiben, um eine Binärdatei in einen Puffer zu lesen, und dann den Puffer in eine andere Datei zu schreiben. Ich habe den folgenden Code, aber der Puffer speichert nur ein paar ASCII-Zeichen aus der ersten Zeile in der Datei und sonst nichts.
int length;
char * buffer;
ifstream is;
is.open ("C:\\Final.gif", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();
FILE *pFile;
pFile = fopen ("C:\\myfile.gif", "w");
fwrite (buffer , 1 , sizeof(buffer) , pFile );
Antworten:
Wenn Sie dies auf C ++ - Weise tun möchten, gehen Sie folgendermaßen vor:
Wenn Sie diese Daten in einem Puffer benötigen, um sie oder etwas anderes zu ändern, gehen Sie folgendermaßen vor:
quelle
char
wird in C / C ++ zum Speichern von Bytes verwendet (und das schon seit 40 Jahren). es ist sicher so, so lange zu tun , wie Sie versuchen , nicht wirklich USE , dass die Daten als Zeichen (nicht strlen () verwenden Sie darauf nicht , es drucken zu trösten, etc). c ++ 17 führtstd::byte
zu diesem Zweck ein (was eigentlich immer nochchar
in Verkleidung ist)Hier ist ein kurzes Beispiel, wie C ++ verwendet wird
rdbuf
. Ich habe das aus dem Internet bekommen. Ich kann meine ursprüngliche Quelle dazu nicht finden:quelle
Verwenden Sie stattdessen die Länge.
Auch besser
fopen
mit "wb
" zu verwenden ....quelle
buffer.length()
für Puffer verwendet werden, enthält möglicherweise NULL-Werte, wodurch der Zweck von strlen / length () zunichte gemacht wird.sizeof(buffer)
.sizeof (buffer) ist die Größe eines Zeigers in Ihrer letzten Zeile, NICHT die tatsächliche Größe des Puffers. Sie müssen stattdessen die bereits festgelegte "Länge" verwenden
quelle
Sie sollten Länge anstelle von sizeof (Puffer) an fwrite übergeben.
quelle
Es gibt einen viel einfacheren Weg. Dies ist egal, ob es sich um eine Binär- oder Textdatei handelt.
Verwenden Sie noskipws.
quelle
Dies kann mit einfachen Befehlen im folgenden Snippet erfolgen.
Kopiert die gesamte Datei beliebiger Größe. Keine Größenbeschränkung!
Verwenden Sie einfach diese. Getestet und funktioniert !!
Eine kleinere Puffergröße wäre hilfreich beim Kopieren kleiner Dateien. Sogar "char buffer [2]" würde den Job machen.
quelle
int[]
statt deklarierenchar[]
?char[]
Dateien jeder Größe funktioniert, was bedeutet, dass es keine Bedingung gibt, dass die Dateigröße ein Vielfaches der Puffergröße sein sollte.