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* オブジェクトを返します。
関数 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;
}
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
著者: 胡金庫
