2011-04-06 10 views
9

posibles duplicados:
Is std::ifstream significantly slower than FILE?
Which I/O library do you use in your C++ code?ARCHIVO vs fstream

me preguntaba ¿cuáles son los pros o los contras de la utilización fstream más de archivo en C++?

El único profesional que creo es que FILE es más eficiente que fstream.

+1

El título de esta pregunta lo hace un excelente candidato como una pregunta canónica sobre el tema, especialmente teniendo en cuenta que hay una excelente respuesta aceptada.Creo que esta pregunta puede interpretarse específicamente como una pregunta de tecnología con una respuesta específica (así como una pregunta más general sobre una recomendación para una elección de biblioteca, que parece ser la interpretación que causó que se cerrara la pregunta, dado el dos preguntas que aparecen enumeradas como duplicadas), así que he votado para reabrir la pregunta. –

Respuesta

26

Uno es C y uno es C++. Tomate, tomate (Esa expresión no funciona tan bien cuando la escribes). Supongo que no es probable que veas una diferencia en el rendimiento.

Una persona muy inclinada, con C++ anti-C probablemente le diga algo similar a fstream pudiendo tratar con diferentes tipos con más facilidad. Con FILE tiene dos opciones: tratar en bytes o tratar cadenas de formato. Desde printf o fwrite y col. No sé cuál es el tipo "real" de sus argumentos. Esto hace que sea más fácil equivocarse. También está el hecho de que una clase de C++ tendrá un destructor y entonces se limpiará "gratis" cuando el objeto se salga del alcance. (Aunque ... ¿De verdad quieres que algo como fflush suceda silenciosamente en un destructor? Probablemente no.) Para este tipo de argumentos, diría que en realidad no es que es una gran carga usar FILE, pero bueno, algunos la gente se siente más fuerte que yo en estos asuntos.

Eventualmente se reducirá a lo que su aplicación está tratando de hacer, y es posible que FILE, fstream, o ambos puedan satisfacer sus necesidades.

Elija lo que funciona, sea flexible con lo que otras personas elijan, comprenda los argumentos y no se vuelva demasiado religioso al respecto. Ese es mi consejo. :-)

+3

+1 para el último párrafo. :) – acegs

11
  • fstream es una mejor encapsulación y tiene conceptos de nivel superior.
  • fstream es una excepción segura.
  • fstream también es una transmisión y se puede tratar genéricamente como una transmisión.

Imagínese:

vacío leer (istream & ISTR)

podíamos dejar pasar en una ifstream, un istrstream, o incluso cin. Esto es muy útil para pruebas unitarias.

2

std::fstream es typesafe, tiene soporte de internacionalización y es (advertencia: opinión) más fácil de usar.

Cuando un std::fstream sale del alcance se destruye para usted, independientemente de si se olvidó de fstream::close() él.

+2

Creo que el argumento "olvidar cerrar" es algo dudoso. Especialmente la palabra "olvidar" aquí implica que esto te salvará de tener que pensar. Eso no es asi Por ejemplo, si tiene bytes almacenados temporalmente, un cierre también podría tener un color, que puede fallar. ¿Desea que esta falla ocurra en un destructor donde podría ser inconveniente manejarlo? ¿O prefieres que esté en un lugar predecible junto con el resto de tu E/S? Los archivos son un buen ejemplo de cómo la gestión automática de la memoria se rompe. Se pueden tener argumentos similares sobre los lenguajes con GC y por qué no confiar en GC para cerrar un archivo. – asveikau

+2

@asveikau - No estoy en desacuerdo. Sin embargo, es algo que debe notarse como una diferencia entre FILE y fstream, así que lo incluí. Ser un pro o estafa es completamente subjetivo. – octal9

Cuestiones relacionadas