C++ でファイルを一行ずつ読み込む方法

  1. ファイルを一行ずつ読み込むには std::getline() 関数を使う
  2. C ライブラリ getline() 関数を用いてファイルを一行ずつ読み込む方法

この記事では、C++ でファイルを一行ずつ読み込む方法を紹介します。

ファイルを一行ずつ読み込むには std::getline() 関数を使う

関数 getline() は、C++ でファイルを一行ずつ読み込むのに好ましい方法である。この関数は、デリミタ char が見つかるまで入力ストリームから文字を読み込み、文字列に格納します。区切り文字は 3 番目のオプションパラメータとして渡され、デフォルトでは改行文字 \n と見なされます。

ゲットラインメソッドはストリームからデータを読み込める場合には 0 以外の値を返すので、while ループ条件としてこれを記述することで、ファイルの最後までファイルから行を取得し続けることができる。なお、is_open メソッドを用いて入力ストリームにファイルが関連付けられているかどうかを確認するのは良い習慣である。

#include <iostream>
#include <fstream>
#include <vector>

using std::cout; using std::cerr;
using std::endl; using std::string;
using std::ifstream; using std::vector;

int main()
{
    string filename("input.txt");
    vector<string> lines;
    string line;

    ifstream input_file(filename);
    if (!input_file.is_open()) {
        cerr << "Could not open the file - '"
             << filename << "'" << endl;
        return EXIT_FAILURE;
    }

    while (getline(input_file, line)){
        lines.push_back(line);
    }

    for (const auto &i : lines)
        cout << i << endl;

    input_file.close();
    return EXIT_SUCCESS;
}

C ライブラリ getline() 関数を用いてファイルを一行ずつ読み込む方法

関数 getline も同様にファイルを一行ずつループさせ、抽出された行を文字列変数に格納するために用いることができる。主な違いは、fopen 関数を用いてファイルストリームを開くことであり、この関数は FILE* オブジェクトを返します。

関数 getlinechar ポインタを nullptr に設定して格納していることに注意してください。これは関数自身が取得した文字のためにメモリを動的に確保しているためである。したがって、getline の呼び出しに失敗した場合でも、プログラマは char ポインタを明示的に解放すべきである。

また、関数を呼び出す前に size_t 型の 2 番目のパラメータを 0 に設定しておくことも重要である。関数 getline の詳細なマニュアルはこちら](https://linux.die.net/man/3/getline)にある。

#include <iostream>
#include <vector>

using std::cout; using std::cerr;
using std::endl; using std::string;
using std::vector;

int main()
{
    string filename("input.txt");
    vector<string> lines;
    char* c_line = nullptr;
    size_t len = 0;

    FILE* input_file = fopen(filename.c_str(), "r");
    if (input_file == nullptr)
        return EXIT_FAILURE;

    while ((getline(&c_line, &len, input_file)) != -1) {
        lines.push_back(line.assign(c_line));
    }
    for (const auto &i : lines) {
        cout << i;
    }
    cout << endl;
    fclose(input_file);
    free(c_line);

    return EXIT_SUCCESS;
}

関連記事 - C++ File

  • C++ でファイルにテキストを追加する方法
  • C++ でディレクトリ内のファイルの一覧を取得する方法
  • comments powered by Disqus