Dalam senario tertentu, membaca fail ke dalam std::vector
std::ifstream testFile("testfile", "rb"); std::vector<char> fileContents; int fileSize = getFileSize(testFile); fileContents.reserve(fileSize); testFile.read(&fileContents[0], fileSize);
Walau bagaimanapun, pendekatan ini gagal apabila mengubah saiz vektor dengan rizab(), kerana ia sebenarnya tidak memasukkan elemen ke dalam vektor. Akibatnya, cubaan untuk mengakses fileContents[0] akan menyebabkan ralat.
Penyelesaian yang lebih komprehensif melibatkan penggunaan iterator. Menggunakan strim fail input, coretan berikut membolehkan pembacaan fail yang cekap:
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());
Pendekatan ini menggunakan istreambuf_iterator untuk lelaran pada aliran fail input dan memasukkan elemen terus ke dalam vektor.
Jika peruntukan semula menjadi kebimbangan, rizab() boleh digunakan untuk pra-peruntukkan ruang dalam vektor:
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents; fileContents.reserve(fileSize); fileContents.assign(std::istreambuf_iterator<char>(testFile), std::istreambuf_iterator<char>());
Dalam variasi ini, rizab() digunakan untuk memperuntukkan berdasarkan ruang pada saiz fail yang diketahui, dan assign() digunakan untuk mengisi vektor menggunakan iterator.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Membaca Fail menjadi std::vector?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!