記事内にはプロモーションが含まれています

【C++】ofstreamの使い方まとめ!ファイルへの書き込み・追記・バイナリ出力を徹底解説

【C++】ofstreamの使い方まとめ!ファイルへの書き込み・追記・バイナリ出力を徹底解説 C++

C++でプログラムを作成する際、計算結果をログとして保存したり、設定データをファイルに書き出したりする処理は非常に重要です。

C言語の FILE*fopen を使うこともできますが、C++では標準ライブラリである ofstream を使うことで、より安全かつ直感的にファイル操作を行うことができます。

「ファイルに文字を書き込みたいけれど、やり方がわからない」
「既存のファイルに追記(アペンド)するにはどうすればいい?」
「テキストだけでなくバイナリデータも書き込みたい」

このような疑問を持つ方のために、この記事では ofstream の基本的な使い方から、モード指定による追記や上書きの制御、そしてバイナリデータの書き込み方法まで、サンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • 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ステップで行います。

  1. ファイルをオープンする(ofstream オブジェクトの作成)
  2. データを書き込む(<< 演算子や write メソッド)
  3. ファイルをクローズする(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++のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

C++を扱えるエンジニアは希少価値が高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC++の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)