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