¿Cómo leo un archivo en un std::string
, es decir, leo todo el archivo a la vez?¿Cuál es la mejor manera de leer un archivo completo en std :: string en C++?
El llamador debe especificar el modo de texto o binario. La solución debe ser estándar, portátil y eficiente. No debería copiar innecesariamente los datos de la cadena, y debería evitar reasignaciones de memoria mientras lee la cadena.
Una forma de hacer esto sería obtener información del tamaño del archivo, cambiar el tamaño de la std::string
y fread()
en el std::string
's const_cast<char*>()
' ed data()
. Esto requiere que los datos de std::string
sean contiguos, lo que no es requerido por el estándar, pero parece ser el caso para todas las implementaciones conocidas. Lo que es peor, si el archivo se lee en modo texto, el tamaño std::string
puede no ser igual al tamaño del archivo.
A soluciones totalmente correctas, estándar conformes y portátiles podrían ser construidos usando std::ifstream
's rdbuf()
en un std::ostringstream
y desde allí en un std::string
. Sin embargo, esto podría copiar los datos de cadena y/o reasignar innecesariamente la memoria. ¿Son todas las implementaciones de bibliotecas estándar relevantes lo suficientemente inteligentes como para evitar todos los gastos generales innecesarios? ¿Hay alguna otra forma de hacerlo? ¿Perdí alguna función oculta de Boost que ya proporciona la funcionalidad deseada?
Muestre su sugerencia de cómo implementarlo.
void slurp(std::string& data, bool is_binary)
teniendo en cuenta la discusión anterior.
¿Alguien más piensa que esto se parece mucho a una tarea de clase? – Owen
No realmente. Me parece una tarea muy común. – Dima
Aparentemente, esta pregunta es tan relevante como siempre: dos años después, las dos soluciones más eficientes * todavía * copian todo el contenido del archivo en la memoria, y esta copia no puede ser eliminada por el optimizador. Esta es una situación bastante insatisfactoria. –