# Uso de archivos con función freopen
## Introducción
En algunos casos, podemos tener ejercicios de programación que tienen una cantidad de datos de entrada/salida muy grande para verificarlo desde una terminal, y puede ser una ventaja hacer uso de archivos.
Como vimos en la cátedra, el uso de la librería fstream cubre la entrada y salida de archivos con métodos propios, pero en aquellos casos donde solo queramos depurar un programa, puede ser complicado modificar toda la salida estándar debido al formato de salida de fstream.
Para estos casos existe una función (freopen) que redirige la entrada o salida estándar hacia un archivo de texto, permitiéndonos leer o escribir en un archivo sin modificar el código del programa.
Para hacer uso de esta función sólo debemos agregar la función al principio del programa (debajo de la cabecera de la función main()) pasando por parámetros el nombre del archivo, el modo en el que se lo usará, y qué se desea reemplazar de la entrada/salida estándar.
## Prototipo de freopen:
``` C++
freopen(<NombreDeArchivo>, <ModoDeUso>, <QueReemplazar>);
```
## Parámetros de la función
#### <NombreDeArchivo>
Se reemplaza por un string que contenga el nombre del archivo de texto al igual que hacíamos con fstream. Por ejemplo, si nuestro archivo se llama entrada.txt, reemplazamos el parámetro por "entrada.txt".
#### <ModoDeUso>
Se reemplaza por un string indicando de qué manera se usará el archivo (entrada, salida, entrada/salida...).
Las más comunes son:
|"r"|Entrada|
|---|---|
|**"w"**|**Salida**|
#### <QueReemplazar>
Se cambia por la entrada o salida estándar que se quiere redirigir. No va entre comillas.
Las más comunes son:
|stdin|Redirección de la entrada a archivo de entrada|
|-----|----------------------------------------------|
|**stdout**|**Redirección de la salida a archivo de salida**|
## Ejemplos de uso
* Programa que lee desde un **archivo** dos números y escribe en la **consola** la suma:
``` C++
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
freopen ("entrada.txt", "r", stdin); //Se pide que solo la entrada sea por archivo. Todos los cin se leerán desde "entrada.txt"
int numero1, numero2;
cin >> numero1 >> numero2;
cout << numero1 + numero2 << endl;
return 0;
}
```
* Programa que lee desde la **consola** dos números y escribe en un **archivo** la suma:
``` C++
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
freopen ("salida.txt", "w", stdout); //Se pide que solo la salida sea por archivo. Todos los cout se escribirán en "salida.txt"
int numero1, numero2;
cin >> numero1 >> numero2;
cout << numero1 + numero2 << endl;
return 0;
}
```
* Programa que lee desde **un archivo** dos números y escribe en **otro archivo** la suma:
``` C++
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
freopen ("entrada.txt", "r", stdin); //Se pide que la entrada sea por archivo. Todos los cin se leerán desde "entrada.txt"
freopen ("salida.txt", "w", stdout); //Se pide que la salida sea por archivo. Todos los cout se escribirán en "salida.txt"
int numero1, numero2;
cin >> numero1 >> numero2;
cout << numero1 + numero2 << endl;
return 0;
}
```
## Aclaraciones
Estas funciones *no reemplazan bajo ningún contexto* a las funciones de la librería fstream, solo son un complemento para probar códigos en contextos de resolución de problemas. El uso de esta función **no está recomendada para la resolución de parciales o ejercicios, solo para el testeo de los mismos**.
Documentación de freopen:
https://www.cplusplus.com/reference/cstdio/freopen/
###### tags: `AEDD`