DMarlon Studio

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.

C++ · Escribir y leer archivos de texto en DMarlon Studio: el código del ejemplo y su salida en la terminal

`<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::app añade al final sin borrar lo anterior.
  • std::ifstream f("nombre") abre para leer; compruebe if (!f).
  • Se escribe con << y se lee con >> o std::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...