Introducción: por qué trabajar con el sistema de archivos en C++ es fundamental
\n\nCualquier programa serio, tarde o temprano, se enfrenta a la necesidad de guardar datos en el disco o leerlos desde allí. Archivos de configuración, registros, bases de datos, documentos de usuario: todo esto requiere saber interactuar con el sistema de archivos. En C++ existen dos enfoques principales: los flujos clásicos de entrada/salida (biblioteca <fstream>) y el más moderno y de alto nivel std::filesystem (a partir de C++17).
En este artículo, analizaremos escenarios prácticos: desde la lectura y escritura simples de archivos de texto hasta la navegación por directorios y el manejo de errores. Todos los ejemplos están escritos en C++17/20 y listos para usar en sus proyectos.
\n\n1. Fundamentos: lectura y escritura de archivos con fstream
\n\nLa biblioteca <fstream> proporciona tres clases principales: ifstream (flujo de entrada — lectura), ofstream (flujo de salida — escritura) y fstream (flujo bidireccional). Veámoslas con ejemplos.
1.1. Escritura en un archivo de texto
\n\nLa forma más sencilla de escribir datos es usar ofstream. Si el archivo no existe, se creará. Si existe, se sobrescribirá (modo ios::trunc por defecto).
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ofstream outFile("example.txt");\n if (!outFile) {\n std::cerr << "Error al abrir el archivo para escritura\\n";\n return 1;\n }\n\n outFile << "¡Hola, sistema de archivos de C++!\\n";\n outFile << "Línea número 2\\n";\n outFile << 42 << " — es un número.\\n";\n\n outFile.close(); // cerrar manualmente no es obligatorio, pero es una buena práctica\n std::cout << "Datos escritos.\\n";\n return 0;\n}\n\n1.2. Lectura de un archivo de texto
\n\nPara leer, usamos ifstream. La forma más fiable es leer línea por línea con std::getline.
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ifstream inFile("example.txt");\n if (!inFile) {\n std::cerr << "Archivo no encontrado o no se puede abrir\\n";\n return 1;\n }\n\n std::string line;\n while (std::getline(inFile, line)) {\n std::cout << "Leído: " << line << '\\n';\n }\n\n inFile.close();\n return 0;\n}\n\n1.3. Modos de apertura y archivos binarios
\n\nPuede combinar banderas de apertura: ios::app (añadir), ios::binary (modo binario), ios::ate (ir al final). Para archivos binarios, use los métodos read() y write().
#include <fstream>\n#include <vector>\n\n// Ejemplo: escritura y lectura de un vector de números en formato binario\nvoid saveVector(const std::string& filename, const std::vector<int>& data) {\n std::ofstream file(filename, std::ios::binary);\n if (!file) return;\n file.write(reinterpret_cast<const char*>(data.data()), data.size() * sizeof(int));\n}\n\nstd::vector<int> loadVector(const std::string& filename) {\n std::ifstream file(filename, std::ios::binary);\n if (!file) return {};\n file.seekg(0, std::ios::end);\n size_t size = file.tellg() / sizeof(int);\n file.seekg(0, std::ios::beg);\n std::vector<int> data(size);\n file.read(reinterpret_cast<char*>(data.data()), size * sizeof(int));\n return data;\n}\n\n2. Enfoque moderno: std::filesystem (C++17)
\n\nA partir de C++17, la biblioteca estándar incluye el módulo <filesystem>, que permite trabajar con rutas, archivos y directorios de alto nivel y de forma multiplataforma.
2.1. Verificación de existencia y obtención de información del archivo
\n\nMás