C++で他のファイルを読み込み、string型の変数として扱う方法について紹介します。csvファイルをvector型に変換するコードについては「C++でcsv形式のファイルをvectorの二次元配列に変換するコード」で紹介しているので、そちらも参考にしてみてください。また、ファイルの書き込みについては「C++でファイルの作成、書き込みをする方法(std::fstream)について解説」で扱っています。
ファイル読み込みの例(コード)
さっそくですが、ifstreamを用いたファイルの読み込みの例を紹介します。
タイトル:main.cpp
#include <fstream> #include <iostream> #include <string> int main(int argc, char *argv[]){ std::ifstream reading_file; std::string filename = "sample.txt"; reading_file.open(filename, std::ios::in); std::string reading_line_buffer; while(std::getline(reading_file, reading_line_buffer)){ std::cout << reading_line_buffer << std::endl; } return 0; }
ここではsample.txtというtxtファイルを読み取り、標準出力で表示をしています。次項で実行される処理の詳細を紹介します。
コードの解説
コードの解説をしていきます。今回使用したライブラリは三つで、そのうちiostreamはstd::coutなどの標準出力に必要なライブラリ、stringはstring型の変数を用いるために必要なライブラリです。したがって、fstreamのみがファイルの読み込みに必要なライブラリになります。
まず、ifstream型の変数を用意します。ifstreamとはファイルの中身を入力用のストリームして扱うための型です。そして、その変数にopenメンバ関数で読み込みたいファイルのパスを指定し、ファイルの中身を変数に展開します。今回は同じ階層のファイルを相対パスで読み込んでいるため、単にsample.txtと指定しています。open関数では第二引数としてファイルを開くモードを指定しています。これはstd::ios_baseクラスで定義されたモードでinとは読み込み専用を表しています。第二引数は省略可能でifstream方はデフォルトでinが指定されます(今回は故意に第二引数で明示的に指定しています)。
タイトル:main.cpp
std::ifstream reading_file; std::string filename = "sample.txt"; reading_file.open(filename, std::ios::in);
次に(最後に)、getline()関数を用いてreading_file(ifstream型)を一行ずつ読み取り、string型の変数(reading_line_buffer)に代入していきます。
getline()関数は戻り値に読み込みに用いているifstream型を返しますが、ifstream型ではファイルの読み込みに失敗した場合や、eof(ファイル入力の末端)に到達した場合にはfalseをそれ以外の場合にはtrueをbool型の値として保持することができるので、whileの条件に入れることで、ファイルがeofになるまで一行分を読むことができます。
また、getline()関数は引数で与えたifstream型の読み取り位置が移動していきます。したがって、whileで繰り返していくことでi番目の読み取りではi-1番目の読み取りの末尾から読み取りを開始することができるため、特別な指定をすることなく、ファイル全体を読むことができます。
タイトル:main.cpp
std::string reading_line_buffer; while(std::getline(reading_file, reading_line_buffer)){ std::cout << reading_line_buffer << std::endl; }
まとめ
本記事の内容について簡単にまとめておきます。
- fstreamライブラリを用いて、ifstream型を使って他ファイルの内容の読み取りを扱うことができる
- getline()関数を用いることで、1行分のファイルを読み取りことができる
code-databaseではC++に関する記事を執筆中ですのでぜひ参考にしてみてください。