c++ raii

C++ lee el archivo completo en buffer



raii (3)

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es un buen enfoque para leer todo el contenido del archivo en un búfer para C ++?

Mientras que en CI simple podría usar la combinación de funciones fopen(), fseek(), fread() y leer todo el archivo en un búfer, ¿sigue siendo una buena idea usar la misma para C ++? En caso afirmativo, ¿cómo podría usar el método RAII al abrir, asignar memoria a la memoria intermedia, leer y leer el contenido del archivo en la memoria intermedia?

¿Debo crear alguna clase de contenedor para el búfer, que desasigna la memoria (asignada para el búfer) en su destructor, y el mismo contenedor para el manejo de archivos?


Algo que tengo en la mayoría de mis programas:

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

Se puede colocar en un encabezado.
Creo que lo he encontrado aquí: https://.com/a/116220/257568


No hay necesidad de clases de envoltura para una funcionalidad muy básica:

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


Puede acceder al contenido de un archivo con una secuencia de archivo de entrada std::ifstream , luego puede usar std::istreambuf_iterator para iterar sobre el contenido de 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; }

En este caso, estoy usando el iterador para construir una nueva cadena usando el contenido de ifstream, el std::istreambuf_iterator<char>(file) crea un iterador al comienzo del ifstream, y std::istreambuf_iterator<char>() es un iterador construido por defecto que indica el estado especial "fin de la transmisión" que obtendrá cuando el primer iterador llegue al final de los contenidos.