コマンドライン引数で与えられたファイルの中身をcinのように入力する(C++)


はじめに

in.txtというファイルの中身を標準入力する場合,

$ ./a.out < in.txt

という風に実行すると思います.
しかし,コーディングテストサイトといったオンライン上の環境では

$ ./a.out in.txt

と実行方法が決められている事があり,この場合はファイル入力を扱う必要があります.

この実行方法でも,cinに近い方法で入力する方法を紹介します.

コマンドライン引数について

./a.outの後ろの引数を扱うには,args, argvを使う必要があります.
main関数を以下のようにすると,使用できるようになります.

int main(int args, char *argv[])

例えば、以下のコマンドを実行した場合、

$ ./a.out 31 8 abc

argsにはコマンドラインにある文字列の数である4、
argv[0]に"./a.out"、argv[1]に"31"、argv[2]に"8"、argv[3]に"abc"が入ります。
また,argvの中身はそれぞれ文字列です

本題

コマンドライン引数(argv[1])にファイル名が与えられるので,その中身を調べます.

#include <iostream>
#include <fstream>
using namespace std;

int main(int args, char *argv[]) {
    ifstream ifs(argv[1]);
    int x, y;
    ifs >> x >> y;
}

ファイル入力ストリームに目的のファイルをセットします.
すると,このようにcin風の入力ができます.
ifsという文字を使っていますが,何でもいいです.

operator >>の継承元が同じなので,こんな風に書けます.

おわりに

元々この記事では,以下の方法でcinを変える方法を紹介していました.

ifstream in(argv[1]);
cin.rdbuf(in.rdbuf());

しかし,ifstreamを直接cinのように使用する方法を教えて頂き,
こちらの方が良い方法だと判断したので,記事を大幅に変えました.
(kazatsuyuさんありがとうございます!)

何か指摘等があれば,コメントで教えていただけると幸いです.