FILE* можно обернуть в std::unique_ptr с собственным обработчиком освобождения:
#include <cstdio>
#include <memory>
struct FileCloser {
void operator()(std::FILE* file) const noexcept {
std::fclose(file);
}
};
using File = std::unique_ptr<std::FILE, FileCloser>;
Использование внутри функции:
File file{std::fopen("data.txt", "r")};
if (!file) {
return;
}
// Передаём FILE* в функции C-библиотеки
int ch = std::fgetc(file.get());
Когда
file выйдет из области видимости, unique_ptr вызовет fclose. Это работает при обычном завершении функции, раннем return и раскрутке стека при исключении.Так устроен RAII: время жизни ресурса связано со временем жизни объекта. Если
fopen вернул nullptr, обработчик освобождения вызван не будет.
