Saya mencoba menulis kode untuk membaca file biner menjadi buffer, lalu menulis 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 );
Jawaban:
Jika Anda ingin melakukan ini dengan cara C ++, lakukan seperti ini:
Jika Anda membutuhkan data itu dalam buffer untuk mengubahnya atau sesuatu, lakukan ini:
sumber
char
digunakan dalam C / C ++ untuk menyimpan byte (dan telah digunakan selama 40 tahun terakhir). aman untuk melakukannya, selama Anda tidak mencoba untuk benar-benar MENGGUNAKAN data itu sebagai karakter (jangan gunakan strlen () di atasnya, jangan cetak ke konsol, dll). c ++ 17 memperkenalkanstd::byte
untuk tujuan ini (yang sebenarnya masihchar
disamarkan)Berikut adalah contoh singkat, cara C ++ menggunakan
rdbuf
. Saya mendapatkan ini dari web. Saya tidak dapat menemukan sumber asli saya tentang ini:sumber
Gunakan panjang sebagai gantinya.
Selain itu, lebih baik digunakan
fopen
dengan "wb
" ....sumber
buffer.length()
untuk buffer mungkin memiliki nilai NULL di dalamnya sehingga mengalahkan tujuan strlen / length ().sizeof(buffer)
.sizeof (buffer) adalah ukuran pointer pada baris terakhir Anda BUKAN ukuran buffer sebenarnya. Anda perlu menggunakan "panjang" yang sudah Anda tetapkan
sumber
Anda harus meneruskan panjang ke fwrite daripada sizeof (buffer).
sumber
Ada cara yang lebih sederhana. Ini tidak peduli apakah itu file biner atau teks.
Gunakan noskipws.
sumber
Itu dapat dilakukan dengan perintah sederhana di cuplikan berikut.
Menyalin seluruh file dengan ukuran berapa pun. Tidak ada batasan ukuran!
Gunakan saja ini. Diuji Dan Bekerja !!
Memiliki ukuran buffer yang lebih kecil akan membantu dalam menyalin file-file kecil. Bahkan "char buffer [2]" akan melakukan pekerjaan itu.
sumber
int[]
penggantichar[]
?char[]
juga dan file dengan ukuran berapa pun yang berarti tidak ada syarat bahwa ukuran file harus kelipatan ukuran buffer.