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