C++ прочитайте весь файл в буфере [дубликат]

этот вопрос уже есть ответ здесь:

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

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

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

3 ответов


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

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! */
}

вы можете получить доступ к содержимому файла с входной поток файла 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>() - итератор, построенный по умолчанию, который указывает на специальное состояние "конец потока" который вы получите, когда первый итератор достигнет конца содержимого.


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

/** 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();
}

может быть помещен в заголовок.
Я думаю, что нашел его здесь:https://stackoverflow.com/a/116220/257568