Un archivo de texto es un fichero que almacena información como caracteres legibles para que un programa pueda guardar y recuperar datos.
Hasta ahora, todos los programas que hemos hecho tienen “amnesia”. Cuando los cierras, pierden toda la información. Las variables se destruyen y la memoria RAM se libera.
Para que nuestros programas sean útiles en el mundo real, necesitamos persistencia. Y la forma más básica de persistencia son los Archivos de Texto.
En C++, el manejo de archivos se realiza a través de la librería estándar <fstream> (File Stream). Si ya sabes usar std::cout y std::cin para escribir en la consola, tienes el 90% del trabajo hecho, porque los archivos funcionan exactamente igual: son flujos de datos.
Las clases de fstream
Para trabajar con archivos, necesitamos incluir la cabecera:
#include <fstream>
Esta librería nos proporciona tres clases fundamentales:
std::ofstream(Output File Stream): Para escribir en archivos (crearlos o sobrescribirlos).std::ifstream(Input File Stream): Para leer archivos existentes.std::fstream: Para ambas cosas a la vez (lectura y escritura).
Estas clases siguen el principio RAII. Cuando el objeto del archivo se destruye (sale del ámbito), el archivo se cierra automáticamente. No es obligatorio llamar a .close(), aunque a veces es útil hacerlo manualmente.
Escribir en un archivo (ofstream)
Escribir en un archivo es tan sencillo como escribir en cout. Usamos el operador de inserción <<.
#include <iostream>
#include <fstream>
#include <string>
int main() {
// 1. Abrimos el archivo (se crea si no existe)
std::ofstream archivo("notas.txt");
// 2. Comprobamos si se ha abierto correctamente
if (archivo.is_open()) {
// 3. Escribimos datos
archivo << "Lista de tareas:\n";
archivo << "1. Aprender C++\n";
archivo << "2. Dominar los punteros\n";
int prioridad = 10;
archivo << "Prioridad: " << prioridad << "\n";
// 4. Opcional: Cerrar manualmente
archivo.close();
std::cout << "Archivo escrito con exito.\n";
} else {
std::cerr << "Error al abrir el archivo.\n";
}
}
Si ejecutas esto, verás que aparece un fichero notas.txt en la carpeta de tu ejecutable.
Modos de apertura
Por defecto, ofstream sobrescribe el archivo si ya existe (borra el contenido anterior). Si queremos añadir contenido al final (Append), debemos especificarlo en el constructor usando “flags”.
// std::ios::app -> Append (Añadir al final)
std::ofstream archivo("log.txt", std::ios::app);
archivo << "Nueva linea de registro\n";
Leer de un archivo (ifstream)
Leer es un poco más delicado porque el archivo podría no existir o tener un formato inesperado.
Tenemos dos formas principales de leer:
- Palabra por palabra (usando
>>): Igual quecin, se detiene en los espacios. - Línea por línea (usando
std::getline): Lo más común para archivos de texto.
Lectura línea a línea
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream archivo("notas.txt");
if (archivo.is_open()) {
std::string linea;
// Bucle while: "Mientras podamos obtener una linea del archivo..."
while (std::getline(archivo, linea)) {
std::cout << "Leido: " << linea << "\n";
}
archivo.close();
} else {
std::cout << "No se pudo abrir el archivo.\n";
}
}
El patrón while(std::getline(archivo, linea)) es la forma estándar de leer un archivo completo en C++. Es seguro y robusto.
Lectura con formato (>>)
Si sabemos que el archivo tiene una estructura fija (por ejemplo: “Nombre Edad Puntuación”), podemos leer directamente en variables.
Imagina un archivo datos.txt:
Luis 35 100
Ana 28 95
Podemos leerlo así:
std::ifstream archivo("datos.txt");
std::string nombre;
int edad, puntos;
while (archivo >> nombre >> edad >> puntos) {
std::cout << nombre << " tiene " << edad << " años.\n";
}
El operador >> se encarga de convertir el texto a entero (int) automáticamente. Si encuentra algo que no es un número donde esperaba uno, el flujo entrará en estado de error y el bucle se detendrá.
Comprobación de errores
Es vital comprobar siempre si el archivo se ha abierto. El método .is_open() es tu mejor amigo.
Las razones más comunes por las que falla la apertura son:
- El archivo no existe (en modo lectura).
- No tienes permisos de escritura en esa carpeta.
- La ruta del archivo es incorrecta (ojo con las rutas relativas vs absolutas).
Rutas de archivos
En los ejemplos hemos puesto solo "notas.txt". Esto busca el archivo en el directorio de trabajo actual (que suele ser donde está el ejecutable o la carpeta del proyecto, dependiendo de cómo ejecutes).
Si quieres especificar una ruta, recuerda que en Windows la barra invertida \ es un carácter de escape, así que debes ponerla doble \\ o usar la barra normal / (que C++ y Windows aceptan perfectamente).
// Windows (Opción A - Escapada)
std::ifstream f1("C:\\Usuarios\\Luis\\Documentos\\datos.txt");
// Windows/Linux/Mac (Opción B - Barra normal - PREFERIBLE)
std::ifstream f2("C:/Usuarios/Luis/Documentos/datos.txt");