¿Cómo leo un archivo en un archivo std::string
, es decir, leo todo el archivo a la vez?
El llamador debe especificar el modo de texto o binario. La solución debe cumplir con los estándares, ser portátil y eficiente. No debe copiar innecesariamente los datos de la cadena, y debe evitar reasignaciones de memoria mientras lee la cadena.
Una forma de hacer esto sería crear el tamaño del archivo, cambiar el tamaño std::string
y fread()
el std::string
's const_cast<char*>()
' ed data()
. Esto requiere que los std::string
datos sean contiguos, lo cual 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 std::string
tamaño del archivo puede no ser igual al tamaño del archivo.
Se podrían construir soluciones portátiles totalmente correctas, que cumplan con los estándares, utilizando std::ifstream
's rdbuf()
en ay std::ostringstream
desde allí en a std::string
. Sin embargo, esto podría copiar los datos de la cadena y / o reasignar innecesariamente la memoria.
- ¿Son todas las implementaciones de biblioteca estándar relevantes lo suficientemente inteligentes como para evitar toda sobrecarga innecesaria?
- ¿Hay otra forma de hacerlo?
- ¿Perdí alguna función oculta de Boost que ya proporciona la funcionalidad deseada?
void slurp(std::string& data, bool is_binary)
rdbuf
(el que está en la respuesta aceptada) no es el más rápido read
.