C++でプログラムを作成する際、計算結果をログとして保存したり、設定データをファイルに書き出したりする処理は非常に重要です。
C言語の FILE* や fopen を使うこともできますが、C++では標準ライブラリである ofstream を使うことで、より安全かつ直感的にファイル操作を行うことができます。
「既存のファイルに追記(アペンド)するにはどうすればいい?」
「テキストだけでなくバイナリデータも書き込みたい」
このような疑問を持つ方のために、この記事では ofstream の基本的な使い方から、モード指定による追記や上書きの制御、そしてバイナリデータの書き込み方法まで、サンプルコード付きで徹底解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
ofstreamとは?ファイル書き込みの基本クラス
ofstream(Output File Stream)は、ファイルへの出力(書き込み)を担当するクラスです。
<fstream> ヘッダーをインクルードすることで利用可能になります。
std::cout と同じように << 演算子を使ってデータを流し込むことができるため、C言語の fprintf などに比べて直感的に記述できるのが特徴です。
基本的な書き込み手順
ファイルへの書き込みは、以下の3ステップで行います。
- ファイルをオープンする(
ofstreamオブジェクトの作成) - データを書き込む(
<<演算子やwriteメソッド) - ファイルをクローズする(
closeメソッド)
サンプルコード:テキストファイルへの書き込み
まずは、最もシンプルな「テキストファイルを作成して文字列を書き込む」例を見てみましょう。
#include <iostream>
#include <fstream> // ofstreamを使うために必要
#include <string>
int main() {
// 1. ファイルをオープン(作成)する
// コンストラクタにファイル名を渡すと自動的にオープンされる
std::ofstream ofs("output.txt");
// ファイルが開けたか確認
if (!ofs) {
std::cerr << "ファイルを開けませんでした。" << std::endl;
return 1;
}
// 2. データを書き込む
ofs << "Hello, C++ File I/O!" << std::endl;
ofs << "数値も書き込めます: " << 12345 << std::endl;
// 3. ファイルをクローズする
// デストラクタで自動的に閉じられるため、明示的なcloseは必須ではないが推奨
ofs.close();
std::cout << "書き込みが完了しました。" << std::endl;
return 0;
}
実行結果
プログラムを実行すると、同じフォルダに output.txt が生成され、以下の内容が書き込まれます。
Hello, C++ File I/O!
数値も書き込めます: 12345
std::ofstream ofs("output.txt"); の行で、output.txt という名前のファイルを開いています。
ファイルが存在しない場合は新規作成され、既に存在する場合は中身が空になって上書きされます(デフォルトの挙動)。
ofs << ... の部分は std::cout と全く同じ感覚で使用できます。
文字列だけでなく、数値や変数もそのまま書き込めるのが大きなメリットです。
追記モード(append)で書き込む方法
ログファイルのように、既存のファイルの内容を消さずに、末尾に新しいデータを追加したい場合は、オープンモードに std::ios::app を指定します。
追記書き込みのサンプルコード
#include <iostream>
#include <fstream>
int main() {
// 第2引数に std::ios::app を指定してオープン
std::ofstream ofs("log.txt", std::ios::app);
if (!ofs) {
std::cerr << "エラー: ファイルを開けません。" << std::endl;
return 1;
}
// 書き込むデータ
ofs << "追記されたログメッセージです。" << std::endl;
return 0;
}
コンストラクタの第2引数(または open メソッドの第2引数)に、モードフラグを指定できます。
std::ios::app(appendの略)を指定すると、書き込み位置がファイルの末尾にセットされた状態でオープンされるため、既存のデータを保持したまま追記が可能になります。
主なオープンモード一覧
| モード | 説明 |
|---|---|
std::ios::out |
書き込み専用で開く(デフォルト)。 |
std::ios::app |
追記モード。書き込み位置を常に末尾にする。 |
std::ios::trunc |
ファイルの中身を削除してサイズを0にする(デフォルト)。 |
std::ios::binary |
バイナリモードで開く(改行コードの変換を行わない)。 |
複数のモードを組み合わせる場合は、|(ビット論理和)演算子を使用します。
例:std::ofstream ofs("file.bin", std::ios::binary | std::ios::app);
バイナリデータを書き込む方法(writeメソッド)
画像データや独自のデータ構造をファイルに保存する場合は、テキスト形式ではなくバイナリ形式で書き込む必要があります。
この場合、<< 演算子ではなく write メソッドを使用します。
バイナリ書き込みのサンプルコード
#include <iostream>
#include <fstream>
#include <vector>
int main() {
// バイナリモードでオープン
std::ofstream ofs("data.bin", std::ios::binary);
if (!ofs) {
return 1;
}
// 書き込むデータ(int型の配列)
int numbers[] = {10, 20, 30, 40, 50};
// writeメソッドで書き込む
// 第1引数: データの先頭アドレスを char* にキャスト
// 第2引数: 書き込むバイト数(sizeofで計算)
ofs.write(reinterpret_cast<char*>(numbers), sizeof(numbers));
ofs.close();
std::cout << "バイナリ書き込み完了" << std::endl;
return 0;
}
バイナリモード std::ios::binary を指定して開くことが重要です。
これを忘れると、特定のバイト列(改行コードなど)がOSによって勝手に変換され、データが破損する原因になります。
write メソッドは char* 型のポインタを要求するため、reinterpret_cast<char*> を使ってデータのポインタをキャストして渡します。
ファイルが開けない場合のエラー処理(例外)
ファイル操作には、権限不足やディスク容量不足など、様々なエラーがつきものです。
if (!ofs) でチェックするだけでなく、例外(Exception)を使ってエラーを補足することも可能です。
例外を有効にする設定
#include <iostream>
#include <fstream>
int main() {
std::ofstream ofs;
// 例外を投げるように設定
// failbit(論理エラー)や badbit(読み書きエラー)で例外発生
ofs.exceptions(std::ios::failbit | std::ios::badbit);
try {
ofs.open("readonly.txt"); // 権限がないファイルを開こうとしたと仮定
ofs << "test";
}
catch (const std::ios_base::failure& e) {
std::cerr << "ファイル操作エラーが発生しました: " << e.what() << std::endl;
}
return 0;
}
デフォルトでは ofstream は例外を投げませんが、exceptions メソッドで設定を変更することで、エラー発生時に std::ios_base::failure 例外をスローさせることができます。
大規模なアプリケーションでエラー処理を統一したい場合に便利な機能です。
C++のスキルを活かして年収を上げる方法
以上、C++でのofstreamの使い方について解説しました。
C++を扱えるエンジニアは希少価値が高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



