Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengoptimumkan Membaca Fail Perduaan menjadi Vektor Aksara Tidak Bertanda?

Bagaimana untuk Mengoptimumkan Membaca Fail Perduaan menjadi Vektor Aksara Tidak Bertanda?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 03:37:02271semak imbas

How to Optimize Reading Binary Files into a Vector of Unsigned Chars?

Pengoptimuman Pembacaan Fail Perduaan

Untuk membaca fail binari secara optimum ke dalam vektor aksara tidak bertanda, pertimbangkan strategi berikut:

Kaedah 1: Pembinaan Vektor Tersuai

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

Kaedah ini secara eksplisit mencipta vektor dengan saiz yang betul berdasarkan saiz fail. Walau bagaimanapun, ia menghantar data vektor ke char*, yang tidak diingini.

Kaedah 2: Istreambuf Iterator

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

Kaedah ini menggunakan lelaran yang membaca data ke dalam penimbal char secara dalaman. Walaupun ia lebih pendek, ia masih memerlukan char iterator walaupun membaca aksara yang tidak ditandatangani.

Kaedah 3: Pengkhususan Ifstream Asas

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

Kaedah ini menggunakan aliran fail input khusus untuk aksara yang tidak ditandatangani. Walau bagaimanapun, ia mungkin tidak sesuai untuk semua kes.

Pengoptimuman

  • Kapasiti Rizab: Praperuntukan memori untuk vektor meningkatkan prestasi.
  • Lumpuhkan Penindasan Baris Baharu: ios::skipws dalam mod binari boleh menyebabkan isu prestasi; nyahdayakannya dengan unsetf.
  • istream_iterator vs. std::copy: std::copy boleh mengelakkan overhed dikaitkan dengan operator >>.

Pertimbangan

  • Iterators Istreambuf mungkin lebih disukai kerana kesederhanaan mereka, tetapi iterator tersuai mungkin menawarkan prestasi yang lebih baik.
  • Kaedah "terbaik" bergantung pada keperluan khusus bagi aplikasi dan data yang sedang dibaca.

Atas ialah kandungan terperinci Bagaimana untuk Mengoptimumkan Membaca Fail Perduaan 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