Как мне прочитать файл в std::string
, т. Е. Прочитать весь файл сразу?
Текстовый или двоичный режим должен быть указан вызывающим. Решение должно быть совместимым со стандартами, портативным и эффективным. Он не должен без необходимости копировать данные строки и должен избегать перераспределения памяти при чтении строки.
Один из способов сделать это - установить размер файла, изменить размер std::string
и fread()
на const_cast<char*>()
'ed data()
std::string
. Для этого требуется, чтобы данные std::string
были непрерывными, что не требуется стандартом, но, похоже, так обстоит дело для всех известных реализаций. Что еще хуже, если файл читается в текстовом режиме, размер std::string
может не совпадать с размером файла.
Полностью правильные, совместимые со стандартами и переносимые решения могут быть созданы с использованием rdbuf()
std::ifstream
в std::ostringstream
, а оттуда в std::string
. Однако это может скопировать строковые данные и / или без необходимости перераспределить память.
- Достаточно ли умны все соответствующие реализации стандартных библиотек, чтобы избежать ненужных накладных расходов?
- Есть другой способ сделать это?
- Я пропустил какую-то скрытую функцию Boost, которая уже обеспечивает желаемую функциональность?
void slurp(std::string& data, bool is_binary)
rdbuf
(тот, что в принятом ответе) не самый быстрый,read
. - person legends2k   schedule 27.11.2014