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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ifstreamによるファイル読み込み
- ofstreamによるファイル書き込み
- バイナリファイルI/O
- エラー処理と状態