Как сохранить содержимое файла в std::string, используя его название?

Рейтинг: 0Ответов: 1Опубликовано: 17.03.2023

Во время использования парсера json (https://github.com/gregjesl/simpleson) возникла проблема - насколько я понял, с его помощью можно обрабатывать строки, но не файлы. Поэтому у меня возникла потребность перенести содержимое файла в строку std::string. Почитал похожие вопросы - ответы разнятся. Файл довольно велик, поэтому вопрос скорости стоит. Важно, чтобы решение работало для расширения json (хотя с этим, я думаю проблем не будет).

В аргументы функции открытия хотелось бы передавать путь файла, а не объект потока, как это предлагали в других обсуждениях. То есть выглядеть объявление должно так: std::string get_from_file(const char* path).

Итак, что же мне предпринять?

Ответы

▲ 2Принят

Итак, есть решение, которое нашел на просторах инета автор вопроса, но есть и

Файл довольно велик, поэтому вопрос скорости стоит

Код 1 с просторов Интернета.

ifstream file("LagreFile", ios_base::binary);
string str{istreambuf_iterator<char>(file), istreambuf_iterator<char>()};

Код 2, предложенный мною в комментарии.

ifstream file("LargeFile", ios_base::binary);
file.seekg(0,ios_base::end);
unsigned int sz = file.tellg();
string str(sz,' ');
file.seekg(0);
file.read(str.data(),sz);

Потом я записываю строку в другой файл, смотрю, что получилось... Естественно, время замеряю только то, что потрачено на чтение в память.

Все получается нормально, записанный файл соответствует считанному. Размер файла — примерно полтора гигабайта.

Первый код работает у на чтение меня примерно 10.4 с, второй — 1.4 с.

Да, есть еще, например, Код 3.

ifstream file("LargFile", ios_base::binary);
ostringstream str;
str << file.rdbuf();

После чего файл оказывается в строке str.str(). Этот код работает у меня примерно 8.0 с.