• std::lock_guard
  • std::unique_ptr
  • std::shared_ptr
  • std::unique_lock
  • std::jthread
  • std::fstream
#include <iostream>
#include <memory>
 
// // before C++ 20
// struct file_closer {
//     void operator()(FILE* stream) {fclose(stream);}
// };
// using cfile = std::unique_ptr<FILE, file_closer>;
 
// C++ 20
using cfile = std::unique_ptr<FILE, decltype([](FILE* stream){fclose(stream);})>;
 
auto make_cfile(char const* file_name, char const* mode) {
    FILE* stream{fopen(file_name, mode)};
    if(not stream) {
        throw std::runtime_error{"Failed to open file"};
    }
    return cfile{stream};
}
 
void fn() {
    auto file{make_cfile("file_name.txt", "w")};
    fprintf(file.get(), "data for the file");
}
 
int main() {
    fn();
    return 0;
}

Reference