Introducción
Trabajar con el sistema de archivos es una de las tareas clave en cualquier programación de aplicaciones. En C++ existen dos enfoques principales: el clásico (usando la biblioteca <fstream>) y el moderno (usando la biblioteca <filesystem>, disponible a partir del estándar C++17). En este artículo, analizaremos con ejemplos prácticos cómo leer y escribir archivos, crear y eliminar directorios, así como verificar la existencia de archivos.
El material será útil tanto para principiantes que recién están aprendiendo C++, como para desarrolladores experimentados que deseen refrescar sus conocimientos sobre las capacidades modernas del lenguaje.
1. Lectura y escritura de archivos de texto con fstream
La biblioteca <fstream> proporciona clases para trabajar con archivos: ifstream (lectura), ofstream (escritura) y fstream (lectura y escritura).
1.1. Escritura de datos en un archivo
Para escribir en un archivo, usamos un objeto ofstream. Si el archivo no existe, se creará. Si existe, el contenido se sobrescribirá (por defecto).
#include <iostream>#include <fstream>#include <string>
int main() { std::ofstream outFile("example.txt"); if (!outFile.is_open()) { std::cerr << "¡Error al abrir el archivo!" << std::endl; return 1; }
outFile << "¡Hola, mundo!" << std::endl; outFile << "Esta es la segunda línea." << std::endl; outFile.close(); std::cout << "Datos escritos." << std::endl; return 0;}Tenga en cuenta: siempre verificamos si se pudo abrir el archivo y lo cerramos después de usarlo.
1.2. Lectura de datos de un archivo
Para leer, usamos ifstream. La forma más sencilla es leer línea por línea con std::getline.
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inFile("example.txt"); if (!inFile.is_open()) { std::cerr << "¡Error al abrir el archivo!" << std::endl; return 1; }
std::string line; while (std::getline(inFile, line)) { std::cout << line << std::endl; } inFile.close(); return 0;}Este método es conveniente porque maneja automáticamente el final del archivo y no requiere verificaciones adicionales.
1.3. Modos de apertura de archivos
Puede combinar banderas para controlar el modo de apertura. Por ejemplo, para agregar datos al final del archivo (modo append), use la bandera std::ios::app:
std::ofstream outFile("example.txt", std::ios::app);outFile << "Línea adicional." << std::endl;outFile.close();Otras banderas útiles: std::ios::binary (modo binario), std::ios::trunc (limpiar el archivo al abrirlo).
2. Trabajo moderno con el sistema de archivos (C++17 y filesystem)
La biblioteca <filesystem> simplifica enormemente las manipulaciones con archivos y carpetas. Todas las funciones se encuentran en el espacio de nombres std::filesystem.
2.1. Verificación de existencia de un archivo o directorio
La función exists() devuelve true si el objeto existe:
#include <iostream>#include <filesystem>
namespace fs = std::filesystem;
int main() { std::string path = "example.txt"; if (fs::exists(path)) { std::cout << "El archivo existe." << std::endl; } else { std::cout << "Archivo no encontrado." << std::endl; } return 0;}2.2. Creación y eliminación de directorios
Para crear una carpeta, use create_directory(). Para eliminar, use remove() o remove_all() (eliminación recursiva).