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
Lepaskan: 2024-12-14 00:06:11
asal
404 orang telah melayarinya

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 );
Salin selepas log masuk

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));
}
Salin selepas log masuk

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), {});

}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan