-1

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?

Jogofus
  • 765
  • 3
  • 15
  • 27

1 Answers1

5

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 que fstream 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 fstreamsea 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++.

eferion
  • 49,291
  • 5
  • 30
  • 72