Archivos en C++: de principiante a profesional en 20 minutos
\n\nImagina que tu programa es un excelente chef. Sabe cocinar, pero todos los ingredientes deben traerse a mano, y las recetas desaparecen después de cada uso. No suena muy bien, ¿verdad? Por eso, cualquier desarrollador que se precie debe saber trabajar con archivos y el sistema de archivos. En C++ esto no es solo "posible", es la base, sin la cual te sentirás inseguro como programador.
\n\nHoy analizaremos el trabajo con archivos en C++ para que no solo copies el código, sino que realmente entiendas lo que sucede bajo el capó. Sin conferencias aburridas, con ejemplos vivos y consejos prácticos. ¡Vamos allá!
\n\nFlujos: la base del trabajo con archivos en C++
\n\nEn C++, el trabajo con archivos se basa en flujos. Si ya conoces cout y cin, considera que ya tienes medio camino recorrido. Los flujos de archivos funcionan con el mismo principio, solo que en lugar de la pantalla o el teclado, los datos se envían a un archivo o se cargan desde él.
Los principales actores en el campo son:
\n\n- \n
ifstream— para leer desde un archivo (input file stream). \n ofstream— para escribir en un archivo (output file stream). \n fstream— flujo universal para lectura y escritura. \n
Todas estas clases viven en el archivo de cabecera <fstream>. No olvides incluirlo, o el compilador se enfadará contigo.
Cómo abrir un archivo y no volverse loco
\n\nAbrir un archivo en C++ es como abrir una puerta: necesitas saber a dónde ir y para qué. Veamos un ejemplo simple de apertura de un archivo para escritura:
\n\n#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ofstream outFile("example.txt"); // Abrimos el archivo para escritura\n \n if (outFile.is_open()) {\n outFile << "¡Hola, archivo!" << std::endl;\n outFile << "Esta es la segunda línea." << std::endl;\n outFile.close(); // Cerramos el archivo\n std::cout << "¡Escritura realizada con éxito!" << std::endl;\n } else {\n std::cerr << "¡No se pudo abrir el archivo!" << std::endl;\n }\n \n return 0;\n}\n\n\nObserva: siempre verificamos si el archivo se abrió con is_open(). Si el archivo no existe, ofstream lo creará automáticamente. Y si no se puede (por ejemplo, no hay permisos de escritura), el programa no fallará, sino que informará del error.
Modos de apertura: cuando uno solo no es suficiente
\n\nPor defecto, ofstream sobrescribe el archivo, y ifstream solo lee. Pero, ¿qué pasa si quieres añadir datos al final del archivo? ¿O abrir un archivo para lectura y escritura simultáneamente? Aquí es donde entran en juego las banderas de modo:
- \n
std::ios::in— abrir para lectura. \n std::ios::out— abrir para escritura (por defecto para ofstream). \n std::ios::app— añadir al final del archivo (append). \n std::ios::ate— mover el cursor al final al abrir. \n std::ios::binary— abrir en modo binario. \n
Ejemplo de uso de modos:
\n\nstd::ofstream logFile("log.txt", std::ios::app); // Añadimos al final\nif (logFile.is_open()) {\n logFile << "Nueva entrada en el registro" << std::endl;\n logFile.close();\n}\n\n\nY si necesitas leer y escribir, usa fstream con banderas combinadas:
std::fstream file("data.txt", std::ios::in | std::ios::out);\n\n\nLectura de archivos: por palabras y por líneas
\n\nLeer de un archivo en C++ es todo un arte. Se puede leer por palabras, por líneas, por caracteres. La elección depende de la tarea.
\n\nLectura por líneas (la forma más popular)
\n\n#include <fstream>\n#include <iostream>\n#include <string>\n\nint main() {\n std::