Bir dosyayı nasıl okuyabilirim std::string
, yani tüm dosyayı aynı anda okuyabilirim?
Metin veya ikili mod arayan tarafından belirtilmelidir. Çözüm standartlara uygun, taşınabilir ve verimli olmalıdır. Dizenin verilerini gereksiz yere kopyalamamalı ve dizeyi okurken belleğin yeniden tahsis edilmesinden kaçınmalıdır.
Bunu yapmanın bir yolu, dosya boyutunu stat, yeniden boyutlandırmak std::string
ve 's ' fread()
içine olacaktır . Bu, standartların gerektirmediği için verilerin bitişik olmasını gerektirir, ancak bilinen tüm uygulamalar için durum böyle görünmektedir. Daha da kötüsü, dosya metin modunda okunursa, boyutu dosyanın boyutuna eşit olmayabilir.std::string
const_cast<char*>()
data()
std::string
std::string
Tamamen doğru, standartlara uygun ve portatif bir çözüm std::ifstream
's rdbuf()
içine std::ostringstream
ve oradan a std::string
. Ancak bu, dize verilerini kopyalayabilir ve / veya gereksiz yere belleği yeniden tahsis edebilir.
- İlgili tüm standart kütüphane uygulamaları gereksiz tüm ek yükü önleyecek kadar akıllı mı?
- Bunu yapmanın başka bir yolu var mı?
- İstenen işlevselliği zaten sağlayan bazı gizli Boost işlevini kaçırdım mı?
void slurp(std::string& data, bool is_binary)
rdbuf
(kabul edilen cevaptaki) en hızlısı değil read
.