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

Bagaimana untuk Membaca Fail Perduaan menjadi Vektor Aksara Tidak Bertanda Dengan Cekap?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-30 08:00:03566semak imbas

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

Membaca Fail Perduaan yang Cekap menjadi Vektor Aksara Tidak Bertanda

Kaedah Membaca Fail Binari

Untuk membaca fail binari dengan cekap ke dalam vektor aksara yang tidak ditandatangani (std::vector), terdapat beberapa kaedah yang tersedia:

Kaedah 1:

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

Kaedah ini membuka fail dan menggunakan file.seekg/file.tellg untuk menentukan saiznya. Ia kemudian memperuntukkan vektor dengan saiz yang sesuai dan membaca data. Walau bagaimanapun, ia memerlukan cast yang jelas untuk char*, yang boleh menyusahkan.

Kaedah 2:

<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 std::istreambuf_iterator untuk berulang aksara fail dan bina vektor, tetapi ia memerlukan penghantaran ke char walaupun vektor menyimpan aksara yang tidak ditandatangani.

Kaedah 3:

<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 secara langsung menggunakan std::basic_ifstream dengan jenis yang diingini, BYTE, mengelakkan keperluan untuk menghantar.

Operasi Di Sebalik Tabir:

Apabila menggunakan std::istreambuf_iterator, operasi asas melibatkan pembacaan daripada penimbal dalaman fail dan menukar data char kepada jenis yang dikehendaki (BYTE dalam kes ini). Walau bagaimanapun, disebabkan proses penukaran ini, beberapa kebimbangan prestasi mungkin timbul.

Pengoptimuman Prestasi:

Untuk mengoptimumkan prestasi, pertimbangkan:

  • Menggunakan std::basic_ifstream untuk pengendalian jenis langsung.
  • Menyimpan kapasiti untuk vektor sebelum membaca untuk mengelakkan pelbagai saiz semula.
  • Menggunakan std::copy dengan iterator khusus untuk memindahkan data daripada fail ke vektor dengan cekap.
  • Memastikan mod binari fail didayakan (std::ios::binary) dan langkau baris baharu dilumpuhkan (std::noskipws), kerana tetapan ini boleh menjejaskan bacaan data binari.

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