Однострочник для чтения текстового файла в std :: string на c ++?

Есть ли однострочная строка для чтения содержимого (не очень большого) текстового файла в строку?

Самое короткое, что я нашел:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
std::istreambuf_iterator<char>());

(Для больших файлов обратите внимание, что это крайне неэффективное решение, поскольку он должен перераспределять буфер после каждого нового символа, который он читает из потока.)

кредит: @Tyler McHenry Прочитать весь файл ASCII в C ++ std :: string

0

Решение

Вы можете сделать это в одном утверждении:

std::string str(std::istreambuf_iterator<char>(std::ifstream("file.txt").rdbuf()), std::istreambuf_iterator<char>());

Является ли это однострочным, зависит от того, насколько велик ваш монитор …

7

Другие решения

обратите внимание, что он не подходит для больших файлов

Вместо «не подходит для больших файлов» Я бы скорее сказал, что это крайне неэффективно решение, так как он должен повторно перераспределять буфер по мере чтения новых символов из потока.

Также обратите внимание, что количество строк вашего кода в этом случае является одной из метрик, на которые вам следует обращать меньше всего внимания. Когда у вас есть ifstream объект (имя которого должно быть более значимым, чем t),
Вы должны проверить его состояние, будь то is_open() и гораздо более разумный способ чтения из этого, кажется, такой подход:

// obtain the size of the input file stream:
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);

// read the file into the string:
std::string fileData(fileSize);
file.read(&fileData[0], fileSize);

«Меньше строк кода» не всегда значит «лучше».

3

По вопросам рекламы [email protected]