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.