0Pricing
C++ Academy · レッスン

ofstreamによるファイル書き込み

出力ファイルに書き込みます

「ofstreamによるファイル書き込み」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

ofstreamとは

std::ofstream(出力ファイルストリーム)は、ファイルにデータを書き込みます。std::coutのように動作しますが、出力先はファイルです。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("hello.txt");
    out << "Hello, file!\n";
    std::cout << "wrote file\n";
    return 0;
}

テキストを書き込む

<<演算子を使うと、コンソールに出力する場合とまったく同じように、文字列や数値を書き込めます。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("report.txt");
    out << "Score: " << 95 << '\n';
    out << "Grade: A\n";
    std::cout << "done\n";
    return 0;
}

デフォルトでは切り詰める

既存のファイルをofstreamで開くと、以前の内容が消去されます。実行するたびに空の状態から始まります。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream("t.txt") << "old content\n";
    std::ofstream out("t.txt");
    out << "new content\n";
    std::ifstream in("t.txt");
    std::string line; std::getline(in, line);
    std::cout << line << '\n';
    return 0;
}

appモードで追記する

std::ios::appを渡すと、既存の内容を保持したまま、末尾に新しいデータを追加できます。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream("log.txt") << "line1\n";
    std::ofstream out("log.txt", std::ios::app);
    out << "line2\n";
    out.close();
    std::ifstream in("log.txt");
    std::string l; int n = 0;
    while (std::getline(in, l)) ++n;
    std::cout << n << " lines\n";
    return 0;
}

書き込みの成功を確認する

ファイルを開いた後にストリームをテストしてください。ストリームがエラー状態の場合、書き込みは何も通知せずに失敗します。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("ok.txt");
    if (!out) {
        std::cout << "failed to open\n";
        return 1;
    }
    out << "safe write\n";
    std::cout << "write ok\n";
    return 0;
}

数値の書き込みと書式設定

std::fixedやstd::setprecisionなどのI/Oマニピュレーターは、ファイルストリームにも適用できます。

#include <iostream>
#include <fstream>
#include <iomanip>

int main() {
    std::ofstream out("pi.txt");
    out << std::fixed << std::setprecision(3) << 3.14159 << '\n';
    out.close();
    std::ifstream in("pi.txt");
    std::string s; in >> s;
    std::cout << s << '\n';
    return 0;
}

データをループで書き込む

ループを使うと、多数の行を書き込めます。各反復で1つのレコードをファイルに送ります。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("squares.txt");
    for (int i = 1; i <= 5; ++i) out << i << ' ' << i * i << '\n';
    out.close();
    std::cout << "wrote 5 rows\n";
    return 0;
}

バッファーをフラッシュする

出力はバッファーに蓄えられます。std::flushまたはstd::endlを使うと、バッファーの内容が直ちにディスクへ書き込まれます。ファイルを閉じる場合もフラッシュされます。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("flush.txt");
    out << "important" << std::flush;
    std::cout << "flushed to disk\n";
    return 0;
}

endlと改行の違い

'\n'は改行を追加するだけです。std::endlは改行を追加したうえでフラッシュも行うため、タイトなループでは処理が遅くなります。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("nl.txt");
    out << "fast\n";          // newline only
    out << "slow" << std::endl; // newline + flush
    std::cout << "both written\n";
    return 0;
}

書き込んでから読み戻す

よく使われるパターンは、データを書き込み、ファイルを閉じてから、再度開いて読み戻す方法です。

#include <iostream>
#include <fstream>

int main() {
    {
        std::ofstream out("rt.txt");
        out << 7 << ' ' << 8 << '\n';
    }
    std::ifstream in("rt.txt");
    int a, b; in >> a >> b;
    std::cout << a + b << '\n';
    return 0;
}

オープンモードを選択する

フラグは|で組み合わせます。一般的なモードには、ios::out(デフォルト)、ios::app(追記)、ios::trunc(消去)があります。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream out("modes.txt", std::ios::out | std::ios::trunc);
    out << "fresh\n";
    std::cout << "opened with explicit modes\n";
    return 0;
}

クイックチェック

ofstreamのモードについて理解度を確認しましょう。

まとめ

std::ofstreamについて、次のことを学びました。

  • <<で書き込み、デフォルトでは内容を切り詰めます
  • std::ios::appで追記します
  • 出力はバッファーに蓄えられ、std::flush、std::endl、またはファイルを閉じることでディスクに書き込まれます

次は、バイナリファイルI/Oを使って生バイトを扱います。

よくある質問

「ofstreamによるファイル書き込み」レッスンは無料ですか?

はい。「ofstreamによるファイル書き込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「ofstreamによるファイル書き込み」で何を学びますか?

出力ファイルに書き込みます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ofstreamによるファイル書き込み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ifstreamによるファイル読み込み
  2. ofstreamによるファイル書き込み
  3. バイナリファイルI/O
  4. エラー処理と状態
← C++ Academyに戻る