3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-22

はじめに

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さんありがとうございます!)

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

3
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?