Lección 19 · 19 de 20
Escribir y leer archivos de texto · C++
Guarde datos en un archivo de texto con std::ofstream y léalos de nuevo con std::ifstream en C++, en la carpeta actual del programa.

`<fstream>` trae los flujos de archivo, que funcionan como std::cout y std::cin. `std::ofstream out("temperatures.txt")` abre el archivo para escribir en la carpeta actual: lo crea si no existe y lo vacía si ya existía. Después se escribe con <<, igual que en la consola.
`close()` cierra el archivo y guarda lo escrito; si se olvida, se cierra solo cuando la variable deja de existir, al final del bloque. Con `std::ios::app` como segundo argumento, el archivo se abre para añadir al final, y Valencia se suma a las tres ciudades.
`std::ifstream in("temperatures.txt")` lo abre para leer. Conviene comprobar que se ha abierto: !in es verdadero si ha fallado (porque el archivo no existe o no hay permiso), y entonces el programa avisa y termina con return 1.
`in >> city >> temp` lee una palabra y un número, como std::cin. Además devuelve el propio flujo, que se evalúa como falso cuando ya no puede leer más, así que while (in >> city >> temp) recorre el archivo hasta el final. Por el camino se cuentan las ciudades y se busca la más calurosa.
Para leer líneas completas, con espacios, se usa std::getline(in, line) en un while, igual que con el teclado en la lección 5. Al ejecutar el ejemplo en DMarlon Studio, temperatures.txt aparece junto al programa.
Código · main.cpp
#include <fstream>#include <iostream>#include <string>int main() { // ofstream writes a file in the current folder (it creates or empties it). std::ofstream out("temperatures.txt"); out << "Madrid 24.5\n" << "Bilbao 17.5\n" << "Sevilla 31.2\n"; out.close(); // std::ios::app adds at the end instead of starting again. std::ofstream more("temperatures.txt", std::ios::app); more << "Valencia 26.8\n"; more.close(); // ifstream reads it; always check that it could be opened. std::ifstream in("temperatures.txt"); if (!in) { std::cout << "Could not open the file\n"; return 1; } // >> reads word by word, just like std::cin, until the end of the file. std::string city, hottestCity; double temp, hottest = -100; int count = 0; while (in >> city >> temp) { std::cout << city << ": " << temp << " C\n"; if (temp > hottest) { hottest = temp; hottestCity = city; } count++; } std::cout << count << " cities, the hottest is " << hottestCity << " (" << hottest << " C)\n"; return 0;}Salida · c++ -std=c++17 main.cpp -o main && ./main
Madrid: 24.5 C Bilbao: 17.5 C Sevilla: 31.2 C Valencia: 26.8 C 4 cities, the hottest is Sevilla (31.2 C)
Para recordar
std::ofstream f("nombre")crea o vacía el archivo para escribir.std::ios::appañade al final sin borrar lo anterior.std::ifstream f("nombre")abre para leer; compruebeif (!f).- Se escribe con
<<y se lee con>>ostd::getline. while (f >> x)lee hasta el final del archivo.
Ejercicio
Después del bucle, abra el archivo con un nuevo std::ifstream y, con while (std::getline(again, line)), escriba cada línea numerada: 1: Madrid 24.5, 2: Bilbao 17.5...