Membaca dan Menulis Fail Perduaan
Membaca dan menulis fail binari melibatkan kerja dengan data mentah, selalunya terdiri daripada kod binari yang mewakili pelbagai jenis data . Satu tugas biasa ialah membaca data daripada fail binari ke dalam penimbal dan kemudian menulisnya ke fail lain.
Masalah:
Apabila cuba membaca dan menulis binari menggunakan kod berikut, hanya beberapa aksara ASCII daripada baris pertama fail disimpan dalam fail penimbal:
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 );
Penyelesaian:
Terdapat dua cara yang mungkin untuk menyelesaikan isu ini:
Menggunakan strim C:
Kaedah ini melibatkan penggunaan kelas ifstream dan ofstream yang disediakan oleh perpustakaan standard C. Ia membolehkan pengendalian fail yang cekap dan mudah alih.
#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)); }
Menggunakan penimbal untuk pengubahsuaian:
Jika data perlu dimanipulasi atau diubah suai sebelum menulisnya ke fail, penimbal boleh digunakan untuk menyimpannya.
#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), {}); }
Atas ialah kandungan terperinci Mengapa Fail Binari Saya Menyalin Sebahagian Sahaja, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!