Bagaimana cara membaca file menjadi std::string
, yaitu, membaca seluruh file sekaligus?
Mode teks atau biner harus ditentukan oleh pemanggil. Solusinya harus sesuai standar, portabel dan efisien. Seharusnya tidak perlu menyalin data string, dan harus menghindari realokasi memori saat membaca string.
Salah satu cara untuk melakukan ini adalah dengan stat filesize, mengubah ukuran std::string
dan fread()
ke std::string
's const_cast<char*>()
' ed data()
. Ini membutuhkan std::string
data yang berdekatan yang tidak diperlukan oleh standar, tetapi tampaknya menjadi kasus untuk semua implementasi yang diketahui. Yang lebih parah, jika file dibaca dalam mode teks, std::string
ukurannya mungkin tidak sama dengan ukuran file.
Solusi yang sepenuhnya benar, sesuai standar dan portabel dapat dibangun menggunakan std::ifstream
's rdbuf()
menjadi std::ostringstream
dan dari sana menjadi a std::string
. Namun, ini dapat menyalin data string dan / atau mengalokasikan kembali memori yang tidak perlu.
- Apakah semua implementasi perpustakaan standar yang relevan cukup pintar untuk menghindari semua overhead yang tidak perlu?
- Apakah ada cara lain untuk melakukannya?
- Apakah saya melewatkan beberapa fungsi Peningkatan tersembunyi yang sudah menyediakan fungsi yang diinginkan?
void slurp(std::string& data, bool is_binary)
rdbuf
(yang ada di jawaban yang diterima) bukan yang tercepat, read
adalah.