Binärdatei lesen und schreiben

Lesezeit: 5 Minuten

Binardatei lesen und schreiben
nf313743

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 );

  • Sie sollten sich für die Handhabung von iostream- oder C-Dateien entscheiden. Bitte nicht beides verwenden.

    – frech

    24. März 2011 um 14:03 Uhr

Binardatei lesen und schreiben
Björn Pollex

Wenn Sie dies auf C++-Weise tun möchten, gehen Sie folgendermaßen vor:

#include <fstream>
#include <iterator>
#include <algorithm>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    std::ofstream output( "C:\\myfile.gif", std::ios::binary );

    std::copy( 
        std::istreambuf_iterator<char>(input), 
        std::istreambuf_iterator<char>( ),
        std::ostreambuf_iterator<char>(output));
}

Wenn Sie diese Daten in einem Puffer benötigen, um sie oder etwas anderes zu ändern, tun Sie dies:

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );

    // copies all data into buffer
    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});

}

  • Was ist, wenn ich nur einige Datensegmente in den Puffer kopieren möchte? Wie kann ich es tun? Sagen wir 1024 Bytes.

    – Likern

    10. Juli 2014 um 15:45 Uhr

  • @Michail Hier Sie können einige Benchmarking finden.

    – Paolo M

    1. Februar 2016 um 16:06 Uhr

  • AFAIK, Binärdateien enthalten manchmal unlesbare Zeichen, tatsächlich sind sie überhaupt keine Zeichen. Ist dieser Code sicher zum Lesen von Nicht-Text-Basisdateien? Meine Kenntnisse sind in diesem Bereich gering 🙂

    – Andiana

    8. November 2016 um 15:09 Uhr

  • sogenannt char wird in C/C++ verwendet, um Bytes zu speichern (und das seit 40 Jahren). Es ist sicher, dies zu tun, solange Sie es nicht tatsächlich versuchen VERWENDEN diese Daten als Zeichen (verwenden Sie nicht strlen() darauf, geben Sie sie nicht auf der Konsole aus usw.). c++17 führt ein std::byte zu diesem Zweck (was eigentlich immer noch char ist char verkleidet)

    – d. Candela

    10. April 2018 um 15:25 Uhr

  • @DavidTran Kann ich nicht sagen, ohne mehr zu wissen – das scheint, als sollten Sie ein Minimalbeispiel erstellen, das das Problem reproduziert, und dann eine Frage stellen.

    – Björn Pollex

    8. Mai 2019 um 6:19 Uhr

1646927409 876 Binardatei lesen und schreiben
Thomas Matthäus

Hier ist ein kurzes Beispiel, das C++ verwendet rdbuf. Ich habe das aus dem Netz. Ich kann meine ursprüngliche Quelle dazu nicht finden:

#include <fstream>
#include <iostream>

int main () 
{
  std::ifstream f1 ("C:\\me.txt",std::fstream::binary);

  std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary);

  f2<<f1.rdbuf();

  return 0;
}

  • Die beste, nicht portable Methode besteht darin, das Betriebssystem Ihre Datei kopieren zu lassen. Schließlich gehört das zu seinem Lebensunterhalt; kein Notwendigkeit für das Rad neu erfinden.

    – Thomas Matthäus

    24. März 2011 um 17:08 Uhr

Binardatei lesen und schreiben
Alexej Sudachen

 sizeof(buffer) == sizeof(char*) 

Verwenden Sie stattdessen die Länge.

Auch besser zu bedienen fopen mit “wb“….

  • Kann nicht verwendet werden buffer.length() for buffer kann NULL-Werte enthalten, wodurch der Zweck von strlen/length() zunichte gemacht wird.

    – John Greene

    30. August 2017 um 17:06 Uhr

  • Besser zu verwenden sizeof(buffer).

    – John Greene

    30. August 2017 um 18:50 Uhr

sizeof(buffer) ist die Größe eines Zeigers auf Ihrer letzten Zeile, NICHT die tatsächliche Größe des Puffers. Sie müssen stattdessen die bereits festgelegte “Länge” verwenden

Sie sollten length anstelle von sizeof(buffer) an fwrite übergeben.

1646927410 469 Binardatei lesen und schreiben
HaseeB Mir

Hier ist die Implementierung von Standard C++ 14 mit Vektoren und Tupel zum Lesen und Schreiben Text,Binary and Hex files.

Snippet-Code:

try {
if (file_type == BINARY_FILE) {

    /*Open the stream in binary mode.*/
    std::ifstream bin_file(file_name, std::ios::binary);

    if (bin_file.good()) {
        /*Read Binary data using streambuffer iterators.*/
        std::vector<uint8_t> v_buf((std::istreambuf_iterator<char>(bin_file)), (std::istreambuf_iterator<char>()));
        vec_buf = v_buf;
        bin_file.close();
    }

    else {
        throw std::exception();
    }

}

else if (file_type == ASCII_FILE) {

    /*Open the stream in default mode.*/
    std::ifstream ascii_file(file_name);
    string ascii_data;

    if (ascii_file.good()) {
        /*Read ASCII data using getline*/
        while (getline(ascii_file, ascii_data))
            str_buf += ascii_data + "\n";

        ascii_file.close();
    }
    else {
        throw std::exception();
    }
}

else if (file_type == HEX_FILE) {

    /*Open the stream in default mode.*/
    std::ifstream hex_file(file_name);

    if (hex_file.good()) {
        /*Read Hex data using streambuffer iterators.*/
        std::vector<char> h_buf((std::istreambuf_iterator<char>(hex_file)), (std::istreambuf_iterator<char>()));
        string hex_str_buf(h_buf.begin(), h_buf.end());
        hex_buf = hex_str_buf;

        hex_file.close();
    }
    else {
        throw std::exception();
    }
}

}

Vollständiger Quellcode kann gefunden werden Hier

Es gibt einen viel einfacheren Weg. Dabei spielt es keine Rolle, ob es sich um eine Binär- oder eine Textdatei handelt.

Verwenden Sie noskipws.

char buf[SZ];
ifstream f("file");
int i;
for(i=0; f >> noskipws >> buffer[i]; i++);
ofstream f2("writeto");
for(int j=0; j < i; j++) f2 << noskipws << buffer[j];

Oder Sie können anstelle des Puffers einfach eine Zeichenfolge verwenden.

string s; char c;
ifstream f("image.jpg");
while(f >> noskipws >> c) s += c;
ofstream f2("copy.jpg");
f2 << s;

normalerweise überspringt stream Leerzeichen wie Leerzeichen oder Zeilenumbrüche, Tabulatoren und alle anderen Steuerzeichen. Aber noskipws macht alle Zeichen übertragen. Dies kopiert also nicht nur eine Textdatei, sondern auch eine Binärdatei. Und Stream verwendet intern Puffer, ich gehe davon aus, dass die Geschwindigkeit nicht langsam sein wird.

  • Vielleicht möchten Sie dies näher erläutern, um es verständlicher zu machen

    – jvh

    5. Oktober 2020 um 11:15 Uhr

988360cookie-checkBinärdatei lesen und schreiben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy