コマンドライン引数で与えられたファイルの中身を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さんありがとうございます!)
何か指摘等があれば,コメントで教えていただけると幸いです.
Author And Source
この問題について(コマンドライン引数で与えられたファイルの中身をcinのように入力する(C++)), 我々は、より多くの情報をここで見つけました https://qiita.com/iwakiriK/items/f735b6dd20c05f30ff65著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .