Frage Binärdatei lesen und schreiben


Ich versuche, Code zu schreiben, um eine Binärdatei in einen Puffer zu lesen, und schreibe dann den Puffer in eine andere Datei. 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 );

75
2018-03-24 14:00


Ursprung


Antworten:


Wenn du das auf C ++ machen willst, mach es so:

#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 zu ändern, führen Sie Folgendes aus:

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

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    // copies all data into buffer
    std::vector<char> buffer((
            std::istreambuf_iterator<char>(input)), 
            (std::istreambuf_iterator<char>()));
}

136
2018-03-24 14:19



 sizeof(buffer) == sizeof(char*) 

Verwenden Sie stattdessen die Länge.

Auch besser zu verwenden fopen mit "wb"....


13
2018-03-24 14:03



Hier ist ein kurzes Beispiel, das C ++ verwendet rdbuf. Ich habe das aus dem Internet bekommen. Ich kann meine ursprüngliche Quelle hier 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;
}

13
2018-03-24 17:07



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


6
2018-03-24 14:01



Sie sollten Länge in fwrite statt sizeof (Puffer) übergeben.


4
2018-03-24 14:02



Es gibt einen viel einfacheren Weg. Dies ist egal, ob es sich um Binär- oder Textdateien 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];

0
2018-05-10 01:14



Ich verstehe wirklich nicht, warum jemand einen so komplizierten Code schreiben würde, wenn es mit so einfachen Befehlen im folgenden Code-Schnipsel passieren kann.

Kopiert die gesamte Datei in beliebiger Größe. Keine Größenbeschränkung!

Benutze das einfach. Getestet und funktioniert !!

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  ifstream infile;
  infile.open("source.pdf",ios::binary|ios::in);

  ofstream outfile;
  outfile.open("temppdf.pdf",ios::binary|ios::out);

  int buffer[2];
  while(infile.read((char *)&buffer,sizeof(buffer)))
  {
      outfile.write((char *)&buffer,sizeof(buffer));
  }

  infile.close();
  outfile.close();
  return 0;
}

Eine kleinere Puffergröße wäre hilfreich beim Kopieren von kleinen Dateien. Sogar "Char-Puffer [2]" würde den Job machen.


-2
2017-11-02 15:33