Crear un archivo de texto en C++

En C++ se escribe un archivo con std::ofstream y el operador <<, igual que en la consola. Lo que el ejemplo de siempre no cuenta es que, si el archivo no se puede abrir, todo lo que escribas desaparece sin un solo aviso.

Escribir

#include <filesystem>
#include <fstream>
#include <iostream>

int main() {
    std::filesystem::create_directories("salida");
    {
        std::ofstream f("salida/notas.txt");
        if (!f) {
            std::cerr << "no se pudo abrir el archivo\n";
            return 1;
        }
        f << "Primera línea\n" << "Segunda línea\n";
    }
    std::cout << "escrito: " << std::filesystem::file_size("salida/notas.txt") << " bytes\n";
}
salidaescrito: 30 bytes

Abrir el archivo en el constructor y comprobarlo con if (!f). Las llaves que rodean el bloque no son decorativas: al salir de ellas, f se destruye y el archivo se cierra solo. Es la forma idiomática de C++, y por eso no hace falta llamar a close().

g++ -std=c++20 -Wall -Wextra -o escribir escribir.cpp && ./escribir

Lo que pasa si no se puede abrir

std::ofstream mal("no_existe/x.txt");
std::cout << (mal ? "bien" : "falló") << "\n";
mal << "esto no va a ninguna parte";
salidaabrir en una carpeta que no existe: falló
y escribir después no avisa de nada
Un ofstream que no se abrió no lanza ninguna excepción. Entra en estado de error y, a partir de ahí, cada << no hace nada. El programa termina con normalidad y el archivo no existe. La versión anterior de esta página no comprobaba si el archivo se había abierto: con una ruta mal escrita, perdías los datos sin enterarte.

Añadir al final

std::ofstream f("salida/notas.txt", std::ios::app);
f << "Tercera línea\n";
salidatras añadir: 45 bytes

Sin std::ios::app, el archivo se vacía al abrirlo.

El stdafx.h

La versión anterior empezaba con #include "stdafx.h". Es un archivo que Visual Studio generaba en sus proyectos para acelerar la compilación, y fuera de ese proyecto no existe:

salidastdafx.cpp:1:10: fatal error: stdafx.h: No such file or directory
    1 | #include "stdafx.h"
      |          ^~~~~~~~~~

No forma parte de C++. Quítalo y el código compila en cualquier sitio. También sobra el using namespace std;: funciona, pero en un programa de verdad acaba provocando choques de nombres, y escribir std:: deja claro de dónde viene cada cosa.

Todo el código se compiló con GCC 16 en modo C++20, con todos los avisos activados, y se ejecutó en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.

1 comentario en «Crear un archivo de texto en C++»

Deja un comentario