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
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!