Rumah >pembangunan bahagian belakang >C++ >Mengapa Fail Binari Saya Menyalin Sebahagian Sahaja, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Fail Binari Saya Menyalin Sebahagian Sahaja, dan Bagaimana Saya Boleh Membetulkannya?

Linda Hamilton
Linda Hamiltonasal
2024-12-14 00:06:11405semak imbas

Why Does My Binary File Copy Only Partially, and How Can I Fix It?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn