C++ でファイルを一行ずつ読み込む方法
胡金庫
2023年10月12日
この記事では、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*
オブジェクトを返します。
関数 getline
は char
ポインタを 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;
}
著者: 胡金庫