はじめに
C++で、プログラムのデータをファイルに保存したり、ファイルからデータを読み込んだりするには、ファイルストリームを利用するのが標準的な方法です。<fstream>
ヘッダーには、ファイル操作のための主要なクラスが用意されています。
std::ofstream
: 出力 (output) ファイルストリーム。ファイルへの書き込み専用。std::ifstream
: 入力 (input) ファイルストリーム。ファイルからの読み込み専用。std::fstream
: 入出力両方が可能なファイルストリーム。
この記事では、最もよく使われる ofstream
と ifstream
を使って、テキストファイルの基本的な読み書きを行う方法を解説します。
ファイルへの書き込みと読み込みのサンプルコード
このコードは、まず ofstream
を使って log.txt
というファイルにデータを書き込みます。次に、ifstream
を使って、今書き込んだファイルからデータを読み込み、コンソールに表示します。
完成コード
#include <iostream>
#include <fstream> // ofstream, ifstream
#include <string>
using namespace std;
int main() {
const string filename = "log.txt";
// --- 1. ファイルへの書き込み (ofstream) ---
{ // スコープを作成
// ofstreamオブジェクトを作成すると、自動的にファイルが開かれる
ofstream ofs(filename);
// ファイルが開けたか確認
if (!ofs) {
cerr << "エラー: ファイルを書き込み用に開けません: " << filename << endl;
return 1;
}
// coutと同じように << 演算子でファイルに書き込む
ofs << "EventID" << " " << 101 << endl;
ofs << "Status" << " " << "Success" << endl;
} // スコープを抜けるとき、ofsのデストラクタが呼ばれ、ファイルが自動で閉じられる
// --- 2. ファイルからの読み込み (ifstream) ---
{ // スコープを作成
ifstream ifs(filename);
if (!ifs) {
cerr << "エラー: ファイルを読み込み用に開けません: " << filename << endl;
return 1;
}
string key1, value2;
int value1;
// cinと同じように >> 演算子でファイルから読み込む
ifs >> key1 >> value1;
ifs >> value2; // 2行目の最初の単語
// 読み込んだ内容を表示
cout << key1 << ": " << value1 << endl;
cout << value2 << ": ";
// 2行目の残りをgetlineで読み込む
string rest_of_line;
getline(ifs, rest_of_line);
cout << rest_of_line << endl;
}
return 0;
}
コードの解説
1. ofstream
: ファイルへの書き込み
ofstream ofs(filename);
ofstream
オブジェクトofs
を作成し、コンストラクタにファイル名filename
を渡すと、その名前のファイルが書き込みモードで開かれます。- もしファイルが存在しなければ、新規作成されます。
- もしファイルが既に存在すれば、その中身は上書きされます(追記したい場合は
ofstream ofs(filename, ios_base::app);
のように第二引数を指定します)。
ofs << "EventID" << ...
cout
と全く同じように、<<
(ストリーム挿入)演算子を使って、様々な型のデータをファイルに書き込むことができます。
2. ifstream
: ファイルからの読み込み
ifstream ifs(filename);
ifstream
オブジェクトifs
を作成すると、指定したファイルが読み込みモードで開かれます。if (!ifs)
: ファイルが存在しない、読み取り権限がないなどの理由でファイルが開けなかった場合、ストリームオブジェクトはfalse
と評価されます。このif
文で、ファイルが正常に開けたかを必ずチェックするのが良い習慣です。
ifs >> key1 >> value1;
cin
と全く同じように、>>
(ストリーム抽出)演算子を使って、スペースや改行で区切られたデータを変数に読み込みます。
RAIIと自動的なファイルクローズ
ofstream
や ifstream
は、RAII (Resource Acquisition Is Initialization) というC++の原則に従って設計されています。
- コンストラクタが呼ばれるとき(オブジェクト作成時)に、ファイルを開く(リソース確保)。
- デストラクタが呼ばれるとき(オブジェクトがスコープ
{}
を抜けるとき)に、自動的にファイルを閉じる(リソース解放)。
これにより、自分で .close()
を呼び出すのを忘れる心配がなくなり、コードがより安全になります。
まとめ
今回は、C++のファイルストリーム ofstream
と ifstream
を使った、基本的なファイルの読み書きについて解説しました。
<fstream>
ヘッダーをインクルードする。ofstream
で書き込み、ifstream
で読み込み用のオブジェクトを作成する。cout
/cin
と同じ<<
/>>
演算子で、直感的に読み書きできる。- ファイルは、ストリームオブジェクトがスコープを抜ける際に自動で閉じられる。
このファイルストリームの仕組みをマスターすることが、C++でファイルベースのアプリケーションを作成するための第一歩です。