format_list_bulleted
【C++】C++でファイルの読み込みを行う方法(std::fstream)について紹介
最終更新日時:2020-12-28 03:54:18



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++に関する記事を執筆中ですのでぜひ参考にしてみてください。