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

Linda Hamilton
Lepaskan: 2024-11-02 03:37:02
asal
139 orang telah melayarinya

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

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!