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
Lepaskan: 2024-10-30 08:00:03
asal
565 orang telah melayarinya

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

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

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

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!

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