Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membaca Fail Perduaan dengan Berkesan menjadi Vektor Aksara Tidak Bertanda?

Bagaimana untuk Membaca Fail Perduaan dengan Berkesan menjadi Vektor Aksara Tidak Bertanda?

Susan Sarandon
Susan Sarandonasal
2024-11-01 09:51:30539semak imbas

How to Effectively Read Binary Files into a Vector of Unsigned Chars?

Membaca Fail Perduaan menjadi Vektor Aksara Tidak Bertanda

Apabila ditugaskan membaca fail binari menjadi vektor aksara tidak bertanda, beberapa pilihan muncul dengan sendirinya.

Pilihan 1: Hantar Eksplisit ke char*

Pendekatan ini membaca data ke dalam vektor menggunakan hantaran eksplisit ke char*:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>

Semasa berfungsi, ia memerlukan pelakon yang jelas, yang boleh menimbulkan keresahan.

Pilihan 2: istreambuf_iterator dengan char

Menggunakan std::istreambuf_iterator dengan char sebagai hujah templat memudahkan kod:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    return std::vector<BYTE>(std::istreambuf_iterator<char>(file),
                            std::istreambuf_iterator<char>());
}</code>

Walau bagaimanapun, ia masih menggunakan char dalam iterator, walaupun vektor mengandungi char yang tidak ditandatangani.

Pilihan 3: basic_ifstream dengan BYTE

Pilihan ini secara eksplisit mengisytiharkan aliran fail input untuk menggunakan BYTE sebagai jenis, memberikan kejelasan niat:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);
    return std::vector<BYTE>(std::istreambuf_iterator<BYTE>(file),
                            std::istreambuf_iterator<BYTE>());
}</code>

Kesesuaian basic_ifstream bergantung pada kes penggunaan tertentu.

istreambuf_iterator: Kesederhanaan vs Kecekapan

std::istreambuf_iterator menawarkan kesederhanaan tetapi mungkin bukan pilihan yang paling berkesan untuk data binari. Ia menggunakan >> untuk mentafsir data, berpotensi memperkenalkan overhed yang tidak perlu. Pertimbangkan pendekatan alternatif seperti std::copy.

Pertimbangan Tambahan

  • Pastikan strim fail dibuka.
  • Uji prestasi berbeza pilihan dengan data binari.
  • Tetapkan std::ios::skipws kepada false untuk fail binari untuk mengelakkan melangkau baris baharu.

Atas ialah kandungan terperinci Bagaimana untuk Membaca Fail Perduaan dengan Berkesan menjadi Vektor Aksara Tidak Bertanda?. 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