【C++】ファイル操作の基本 ofstream(書き込み)とifstream(読み込み)の使い方

目次

はじめに

C++で、プログラムのデータをファイルに保存したり、ファイルからデータを読み込んだりするには、ファイルストリームを利用するのが標準的な方法です。<fstream> ヘッダーには、ファイル操作のための主要なクラスが用意されています。

  • std::ofstream: 出力 (output) ファイルストリーム。ファイルへの書き込み専用。
  • std::ifstream: 入力 (input) ファイルストリーム。ファイルからの読み込み専用。
  • std::fstream: 入出力両方が可能なファイルストリーム。

この記事では、最もよく使われる ofstreamifstream を使って、テキストファイルの基本的な読み書きを行う方法を解説します。


ファイルへの書き込みと読み込みのサンプルコード

このコードは、まず 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と自動的なファイルクローズ

ofstreamifstream は、RAII (Resource Acquisition Is Initialization) というC++の原則に従って設計されています。

  • コンストラクタが呼ばれるとき(オブジェクト作成時)に、ファイルを開く(リソース確保)。
  • デストラクタが呼ばれるとき(オブジェクトがスコープ {} を抜けるとき)に、自動的にファイルを閉じる(リソース解放)。

これにより、自分で .close() を呼び出すのを忘れる心配がなくなり、コードがより安全になります。


まとめ

今回は、C++のファイルストリーム ofstreamifstream を使った、基本的なファイルの読み書きについて解説しました。

  • <fstream> ヘッダーをインクルードする。
  • ofstream書き込みifstream読み込み用のオブジェクトを作成する。
  • cout/cin と同じ << / >> 演算子で、直感的に読み書きできる。
  • ファイルは、ストリームオブジェクトがスコープを抜ける際に自動で閉じられる

このファイルストリームの仕組みをマスターすることが、C++でファイルベースのアプリケーションを作成するための第一歩です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次