Как мне прочитать файл в 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
.