Trabajo con el sistema de archivos en C++: desde lo básico hasta técnicas avanzadas
Trabajar con el sistema de archivos es una de las tareas clave en cualquier aplicación seria en C++. Ya sea para leer archivos de configuración, escribir registros, procesar grandes volúmenes de datos o gestionar proyectos, saber cómo interactuar correctamente con archivos y directorios es necesario para todo desarrollador de C++. En este artículo, analizaremos los enfoques principales para trabajar con el sistema de archivos en C++, desde las funciones clásicas de C hasta el moderno std::filesystem, que apareció en C++17.
Veremos ejemplos prácticos que te ayudarán no solo a entender la teoría, sino también a aplicar inmediatamente los conocimientos adquiridos en proyectos reales. Todos los ejemplos de código están probados y listos para usar.
1. Fundamentos del trabajo con archivos: flujos de entrada/salida
La forma más común de trabajar con archivos en C++ es usando la biblioteca <fstream>. Esta proporciona tres clases principales:
std::ifstream— para leer desde un archivo (input file stream);std::ofstream— para escribir en un archivo (output file stream);std::fstream— para leer y escribir (file stream).
Lectura desde un archivo
Para leer datos de un archivo, crea un objeto std::ifstream y abre el archivo. La forma más sencilla de leer un archivo línea por línea es usando la función std::getline:
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("example.txt"); if (!inputFile.is_open()) { std::cerr << "¡Error al abrir el archivo!" << std::endl; return 1; }
std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; }
inputFile.close(); return 0;}Observa la comprobación is_open() — esta es una práctica importante que evita que el programa se bloquee si el archivo no existe.
Escritura en un archivo
Para escribir datos se usa std::ofstream. Por defecto, el archivo se crea de nuevo (modo trunc). Si necesitas añadir datos al final, usa la bandera std::ios::app:
#include <iostream>#include <fstream>
int main() { std::ofstream outputFile("output.txt", std::ios::app); if (!outputFile.is_open()) { std::cerr << "¡Error al crear el archivo!" << std::endl; return 1; }
outputFile << "Línea 1" << std::endl; outputFile << "Línea 2" << std::endl; outputFile << "Número: " << 42 << std::endl;
outputFile.close(); return 0;}Trabajo con archivos binarios
Para datos binarios, usa los métodos read() y write() especificando el tamaño del bloque:
#include <iostream>#include <fstream>#include <cstring>
struct Record { int id; char name[50]; double value;};
int main() { // Escritura Record r = {1, "Registro de prueba", 3.14}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<const char*>(&r), sizeof(r)); binOut.close();
// Lectura Record r2; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&r2), sizeof(r2)); binIn.close();
std::cout << "ID: " << r2.id << ", Name: " << r2.name << ", Value: " << r2.value << std::endl; return 0;}2. Enfoque moderno: la biblioteca std::filesystem (C++17)
A partir de C++17, se añadió a la biblioteca estándar <filesystem>, que simplifica significativamente el trabajo con el sistema de archivos.