ファイルを開きたい(TFile::Open

1TFile *file = TFile::Open("source.root");
2if (!file || file->IsZombie()) {
3    std::cerr << "Error opening file: source.root" << std::endl;
4    return;
5}

TFile::Openはファイルを開くための静的メソッドです。 第一引数(name)にはファイル名を指定します。 第二引数(option)にはファイルを開くモードを指定します。 デフォルトは読み取り専用モード(read)です。

ファイルが存在しない場合nullptrとなるため!fileでエラーを検出できます。 また、ファイルが正常に開けなかった場合はIsZombie()trueになるため、こちらでもエラーを検出できます。

ファイルを作成したい(recreate

1TFile* file = TFile::Open("output.root", "recreate");
2if (!file || file->IsZombie()) {
3    std::cerr << "Error creating file: output.root" << std::endl;
4    return;
5}

ファイルを作成する場合は、第二引数にrecreate(もしくはRECREATE)を指定します。 同名のファイルが存在する場合は上書きします。

ファイルを上書きしたくない(new / create

1TFile *f = TFile::Open("output.root", "create");
2if (!f || f->IsZombie()) {
3    std::cerr << "Error: File already exists. Use 'recreate' mode to overwrite." << std::endl;
4    return;
5}

createもしくはnewモードを指定してファイルを作成できます。 同名のファイルが存在する場合はエラーになります。

ファイルを追記したい(update

1TFile* f = TFile::Open("output.root", "update");
2if (!f || f->IsZombie()) {
3    std::cerr << "Error opening file for update: output.root" << std::endl;
4    return;
5}

updateモードを指定してファイルを開くと、既存のファイルに追記できます。 ファイルが存在しない場合は新規作成します。

上書き確認したい(TFile::Open / std::filesystem

 1#include <TFile.h>
 2#include <filesystem>
 3#include <iostream>
 4
 5std::string filename = "output.root";
 6if (std::filesystem::exists(filename)) {
 7    std::cout << "File " << filename << " already exists. Do you want to overwrite it? (y/n): ";
 8    char response;
 9    std::cin >> response;
10    if (response != 'y' && response != 'Y') {
11        std::cerr << "Aborted." << std::endl;
12        return;
13    }
14}
15
16TFile* f = TFile::Open(filename.c_str(), "recreate");

ファイルを作成するときに、同名のファイルが存在した場合にユーザーに上書き確認するサンプルです。 C++17以降のstd::filesystemを使用して、ファイルの存在を確認しています。 ユーザーが上書きを拒否した場合は、処理を中断します。

注釈

FileStat_tTSystem::GetPathInfoを使ってファイルの存在を確認する方法もありますが、C++17以降はstd::filesystemを使う方が簡単なようです。