ファイルを開きたい(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_tとTSystem::GetPathInfoを使ってファイルの存在を確認する方法もありますが、C++17以降はstd::filesystemを使う方が簡単なようです。