cpp-archivos-texto

Lectura y escritura de archivos de texto en C++

  • 4 min

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>
Copied!

Esta librería nos proporciona tres clases fundamentales:

  1. std::ofstream (Output File Stream): Para escribir en archivos (crearlos o sobrescribirlos).
  2. std::ifstream (Input File Stream): Para leer archivos existentes.
  3. 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";
    }
}
Copied!

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";
Copied!

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:

  1. Palabra por palabra (usando >>): Igual que cin, se detiene en los espacios.
  2. 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";
    }
}
Copied!

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
Copied!

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";
}
Copied!

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");
Copied!