Як я можу прочитати файл у файл std::string
, тобто прочитати весь файл одразу?
Текстовий або двійковий режим повинен бути визначений абонентом. Рішення повинно бути стандартним, портативним та ефективним. Він не повинен копіювати дані рядка, і він повинен уникати перерозподілу пам'яті під час читання рядка.
Один з способів зробити це було б стат розміру файлу, змінювати розмір std::string
і fread()
в std::string
«s const_cast<char*>()
» під ред data()
. Для цього потрібні std::string
суміжні дані, що не вимагається стандартом, але, мабуть, це стосується всіх відомих реалізацій. Що гірше, якщо файл читається в текстовому режимі, std::string
розмір може не дорівнювати розміру файлу.
Повністю правильні, стандартні та портативні рішення можуть бути побудовані, використовуючи std::ifstream
's rdbuf()
в a, std::ostringstream
а звідти в a std::string
. Однак це може скопіювати рядкові дані та / або непотрібно перерозподілити пам'ять.
- Чи всі відповідні стандартні бібліотечні реалізації достатньо розумні, щоб уникнути зайвих накладних витрат?
- Чи є інший спосіб це зробити?
- Чи пропустив я якусь приховану функцію Boost, яка вже забезпечує бажаний функціонал?
void slurp(std::string& data, bool is_binary)
rdbuf
(той у прийнятій відповіді) не найшвидший, так read
.