0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

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

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