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.
También te puede interesar
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
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.
Si te llega a dar problema con esta libreria #include «stdafx.h» borrala, algunos compiladores ya la tiene y por eso te da error al utilizarla, el programa te correra si la borras