Pertanyaan Membaca dan menulis file biner


Saya mencoba menulis kode untuk membaca file biner menjadi buffer, kemudian tulis buffer ke file lain. Saya memiliki kode berikut, tetapi buffer hanya menyimpan beberapa karakter ASCII dari baris pertama dalam file dan tidak ada yang lain.

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


asal


Jawaban:


Jika Anda ingin melakukan ini dengan cara C ++, lakukan seperti ini:

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

Jika Anda membutuhkan data dalam buffer untuk memodifikasinya atau sesuatu, lakukan ini:

#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*) 

Gunakan panjang sebagai gantinya.

Juga, lebih baik digunakan fopen dengan "wb"....


13
2018-03-24 14:03



Berikut ini contoh singkat, cara menggunakan C ++ rdbuf. Saya mendapat ini dari web. Saya tidak dapat menemukan sumber asli saya tentang ini:

#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 (buffer) adalah ukuran pointer pada baris terakhir Anda BUKAN ukuran sebenarnya dari buffer. Anda perlu menggunakan "panjang" yang telah Anda tetapkan sebagai gantinya


6
2018-03-24 14:01



Anda harus memasukkan panjang ke fwrite bukan sizeof (buffer).


4
2018-03-24 14:02



Ada cara yang jauh lebih sederhana. Ini tidak peduli apakah itu file biner atau teks.

Gunakan 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



Saya benar-benar tidak mengerti mengapa seseorang memilih untuk menulis kode rumit seperti itu ketika itu bisa terjadi dengan perintah sederhana seperti di cuplikan berikut.

Salinan seluruh file dengan ukuran apa pun. Tanpa batasan ukuran!

Gunakan saja ini. Diuji dan Bekerja !!

#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;
}

Memiliki ukuran buffer yang lebih kecil akan sangat membantu dalam menyalin file-file kecil. Bahkan "char buffer [2]" akan melakukan pekerjaan itu.


-2
2017-11-02 15:33