Подтвердить что ты не робот

С++ читает весь файл в буфере

Что такое хороший подход для чтения всего содержимого файла в буфере для С++?

В то время как в простой C я мог использовать комбинацию функций fopen(), fseek(), fread() и прочитать весь файл в буфере, все-таки хорошая идея использовать его для С++? Если да, то как я могу использовать подход RAII при открытии, распределяя память для буфера, чтение и чтение содержимого файла в буфер.

Должен ли я создать некоторый класс-оболочку для буфера, который освобождает память (выделенную для буфера) в нем деструктор и ту же оболочку для обработки файлов?

4b9b3361

Ответ 1

Нет необходимости в классах-оболочках для очень простых функций:

std::ifstream file("myfile", std::ios::binary | std::ios::ate);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);

std::vector<char> buffer(size);
if (file.read(buffer.data(), size))
{
    /* worked! */
}

Ответ 2

Вы можете получить доступ к содержимому файла с потоком входного файла std:: ifstream, затем вы можете использовать std:: istreambuf_iterator, чтобы перебирать содержимое ifstream,

std::string
getFileContent(const std::string& path)
{
  std::ifstream file(path);
  std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

  return content;
}

В этом случае im, использующий итератор для создания новой строки с использованием содержимого ifstream, std::istreambuf_iterator<char>(file) создает итератор для начала ifstream, а std::istreambuf_iterator<char>() - это итератор, построенный по умолчанию, который указывает специальный state "end-of-stream" , который вы получите, когда первый итератор достигнет конца содержимого.

Ответ 3

Что-то, что у меня есть в большинстве моих программ:

/** Read file into string. */
inline std::string slurp (const std::string& path) {
  std::ostringstream buf; std::ifstream input (path.c_str()); buf << input.rdbuf(); return buf.str();
}

Может быть помещен в заголовок.
Я думаю, что нашел его здесь: fooobar.com/info/15436/...