ifstreamによるファイル読み込み
テキストとデータを読み取ります
「ifstreamによるファイル読み込み」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
ifstreamとは
std::ifstream(入力ファイルストリーム)は、ファイルからデータを読み取ります。std::cinのように動作しますが、入力元はディスク上のファイルです。
<fstream>で定義されています。- コンストラクターにファイル名を渡すと、そのファイルを開きます。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("demo.txt") << "hello\n";
std::ifstream in("demo.txt");
std::string word;
in >> word;
std::cout << word << '\n';
return 0;
}ファイルを開く
ファイル名を指定してifstreamを構築し、is_open()でファイルが見つかったかどうかを確認します。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("data.txt") << "42\n";
std::ifstream in("data.txt");
std::cout << (in.is_open() ? "opened" : "failed") << '\n';
return 0;
}単語を読み取る
>>演算子は、cinと同じように、空白で区切られたトークンを読み取ります。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("words.txt") << "alpha beta gamma\n";
std::ifstream in("words.txt");
std::string w;
while (in >> w) std::cout << w << '\n';
return 0;
}数値を読み取る
数値型は直接取り出せます。ストリーム抽出によって、テキストが適切な型に解析されます。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("nums.txt") << "10 20 30\n";
std::ifstream in("nums.txt");
int sum = 0, x;
while (in >> x) sum += x;
std::cout << "sum = " << sum << '\n';
return 0;
}getlineで行を読み取る
std::getline()を使用すると、空白を含む行全体を改行まで読み取れます。
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ofstream("lines.txt") << "first line\nsecond line\n";
std::ifstream in("lines.txt");
std::string line;
while (std::getline(in, line)) std::cout << "[" << line << "]\n";
return 0;
}ファイル全体を読み取る
ファイル全体を一度に読み込むには、ストリームバッファーイテレーターを使って文字列に読み込みます。
#include <iostream>
#include <fstream>
#include <sstream>
int main() {
std::ofstream("all.txt") << "line1\nline2\n";
std::ifstream in("all.txt");
std::stringstream ss;
ss << in.rdbuf();
std::cout << ss.str();
return 0;
}ファイル末尾を検出する
読み取りループは、通常はファイル末尾などで抽出に失敗すると終了します。条件式でストリームをテストすると、この状態を確認できます。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("eof.txt") << "1 2 3\n";
std::ifstream in("eof.txt");
int x, count = 0;
while (in >> x) ++count;
std::cout << "read " << count << " numbers\n";
std::cout << "eof: " << std::boolalpha << in.eof() << '\n';
return 0;
}ファイルが見つからない場合の処理
ファイルが存在しない場合、ストリームは失敗状態になり、is_open()はfalseを返します。読み取りを行う前に必ず確認してください。
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("does_not_exist_12345.txt");
if (!in) {
std::cout << "could not open file\n";
}
return 0;
}構造化された行を解析する
getlineとistringstreamを組み合わせると、各行からフィールドを解析できます。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main() {
std::ofstream("people.txt") << "Alice 30\nBob 25\n";
std::ifstream in("people.txt");
std::string line;
while (std::getline(in, line)) {
std::istringstream ss(line);
std::string name; int age;
ss >> name >> age;
std::cout << name << " is " << age << '\n';
}
return 0;
}明示的に開いて閉じる
デフォルト構築したストリームは、後からopen()で開き、close()で解放できます。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("oc.txt") << "data\n";
std::ifstream in;
in.open("oc.txt");
std::string s; in >> s;
in.close();
std::cout << s << '\n';
return 0;
}RAIIによる自動クローズ
ifstreamがスコープを抜けると、デストラクターがファイルを自動的に閉じます。手動でclose()を呼び出す必要はほとんどありません。
#include <iostream>
#include <fstream>
int main() {
std::ofstream("raii.txt") << "x\n";
{
std::ifstream in("raii.txt");
std::string s; in >> s;
std::cout << s << '\n';
} // file closed here automatically
std::cout << "closed\n";
return 0;
}クイックチェック
行の読み取りについて理解度を確認しましょう。
まとめ
std::ifstreamについて、次のことを学びました。
>>とstd::getlineを使ってファイルから読み取りますis_open()を使うか、ストリームをテストして状態を確認します- スコープを抜けるとRAIIによって自動的に閉じられます
次は、ofstreamを使ってファイルに書き込みます。
よくある質問
「ifstreamによるファイル読み込み」レッスンは無料ですか?
はい。「ifstreamによるファイル読み込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ifstreamによるファイル読み込み」で何を学びますか?
テキストとデータを読み取ります ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ifstreamによるファイル読み込み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ifstreamによるファイル読み込み
- ofstreamによるファイル書き込み
- バイナリファイルI/O
- エラー処理と状態