Comparando las dos librerías de streams de ficheros como son cstdio y fstream llego a la conclusión de que hacen exactamente lo mismo. Estoy estudiando C++. ¿Es mejor opcion seguir con la "evolución" del lenguaje y seguir con fstream? Lo unico que creo que hay diferente es que en cstdio están las funciones rename y remove para renombrar y eliminar ficheros. ¿Esto puede hacerse también con fstream?
-
Lo mejor es lo que creas que es mejor. psd: -1, porque lo que puedo responder de esta pregunta es demasiado subjetivo. – NaCl Apr 12 '17 at 02:22
-
No, no puede. Y, dicho esto, voto por cerrarla como *basada en opiniones*. – Trauma Apr 12 '17 at 04:43
-
1[Relacionado](http://es.stackoverflow.com/questions/48268/librerias-de-c-y-c). – PaperBirdMaster Apr 12 '17 at 07:40
1 Answers
stdio
(o cstdio
) es una librería heredada de C mientras que fstream
es una librería exclusiva de C++. ¿Diferencias? unas cuantas (te enumero algunas):
stdio
es heredada de C mientras quefstream
es propia de C++- las librerías de entrada salida propias de C++ permiten el uso abstracto y homogéneo de su funcionalidad
- las librerías propias de C++ son extensibles
- las librerías propias de C++ pueden hacer uso de
iomanip
stdio
es heredada de C mientras que fstream
es propia de C++
En stdio
encontrarás una colección de funciones (no clases) pensadas para interactuar con la entrada/salida, mientras que en fstream
lo que predominan son las clases (por algo es una librería propia de C++).
las librerías de entrada salida propias de C++ permiten el uso abstracto y homogéneo de su funcionalidad
Al estar basada en clases, y gracias a que estas clases poseen herencia, es posible implementar mecanismos de entrada salida independientes del del origen o destino final de los datos:
// ¿el destino es un fichero? ¿sera la consola? ¿quizas una impresora?
void PrintDatos(std::ostream& out)
{
out << "abcdefg";
}
Esta característica ayuda a reutilizar código. Vale si, alguno me dirá que con stdio
también se puede hacer:
fprintf(stdout,"abcdef");
La diferencia está, en este caso, en que hacer uso de esta característica con stdio
nos va a impedir hacer uso de prácticamente la mitad de la funcionalidad ofrecida por dicha librería ya que las funciones que no admitan como parámetro de entrada un FILE*
no van a poder ser utilizadas en este contexto. Esto último contrasta con las librerías propias de C++ que no pierden funcionalidad.
las librerías propias de C++ son extensibles
Que fstream
sea una librería propia de C++ implica que se ha diseñado pensando en las características propias de C++ lo que implica que, por ejemplo, su funcionalidad es extensible mediante nuestras propias sobrecargas:
struct Test
{
int valor;
char caracter;
Test(int v, char c)
: valor(v), caracter(c)
{ }
};
std::ostream& operator<<(std::ostream& out, Test const& test)
{
return out << test.valor << test.caracter;
}
int main()
{
std::vector<Test> lista { {1,'a'},{2,'b'},{3,'c'},{4,'d'} };
for( auto& test : lista )
std::cout << test;
}
Un diseño similar sería impensable con stdio
o, al menos, sería más aparatoso de programar y menos natural, lo que generaría código más complicado de leer.
las librerías propias de C++ pueden hacer uso de iomanip
Otra característica interesante de la entrada salida propia de C++ es que es posible usar la librería iomanip
para configurar cómo se va a volcar la información. Esta característica por si sola no aporta gran cosa, pero cuando se combina con las características anteriores permite obtener soluciones bastante elegantes:
std::cout << std::setw(10) << std::setfill('#') << 45;
Conclusión
stdio
existe básicamente porque C++ era en sus inicios una especie de C ligeramente vitaminado. Según C++ se fue desligando de su predecesor ha ido adquiriendo librerías propias para sus propios intereses.
Actualmente stdio
sirve más como librería de compatibilidad para poder traer a C++ código C. Si estás haciendo código nuevo es preferible usar las librerías propias de C++.
- 49,291
- 5
- 30
- 72