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

胡金庫 2023年10月12日
  1. ファイルを一行ずつ読み込むには std::getline() 関数を使用する
  2. C ライブラリ getline() 関数を用いてファイルを一行ずつ読み込む方法
C++ でファイルを一行ずつ読み込む方法

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

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

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

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

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

using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;
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 の詳細なマニュアルはこちらにあります。

#include <iostream>
#include <vector>

using std::cerr;
using std::cout;
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;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ File