Desde C++17 hay una forma propia de C++ de renombrar archivos, std::filesystem::rename. La de C, rename, sigue funcionando; la diferencia está en cómo te enteras de que algo salió mal.
También te puede interesar
Con std::filesystem
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::rename("salida/archivo.txt", "salida/renombrado.txt");
std::cout << "existe el viejo " << fs::exists("salida/archivo.txt")
<< ", el nuevo " << fs::exists("salida/renombrado.txt") << "\n";
}salidarenombrado: existe el viejo 0, el nuevo 1
Si algo falla, lanza std::filesystem::filesystem_error, y el mensaje trae las dos rutas:
try {
fs::rename("salida/no_existe.txt", "salida/otro.txt");
} catch (const fs::filesystem_error& e) {
std::cout << e.what() << "\n";
}salidafilesystem error: cannot rename: No such file or directory [salida/no_existe.txt] [salida/otro.txt]
Sin excepciones: error_code
std::error_code ec;
fs::rename("salida/no_existe.txt", "salida/otro.txt", ec);
if (ec) std::cout << ec.message() << "\n";salidaNo such file or directory
Todas las funciones de std::filesystem tienen una versión que, en lugar de lanzar, deja el error en un std::error_code. Útil cuando que falle es algo normal y no excepcional.
La función de C
#include <cstdio>
if (std::rename("salida/no_existe.txt", "salida/otro.txt") != 0)
std::perror("std::rename");salidastd::rename: No such file or directory
Es la que usaba la versión anterior de esta página. Devuelve 0 si fue bien y otra cosa si no, y perror imprime el motivo. Funciona en cualquier compilador de C o C++.
rename sustituyen el destino sin preguntar; en Windows, la función de C falla. Si no quieres pisar nada, comprueba antes con fs::exists.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.