- ベストアンサー
C言語の標準入力について
コマンドプロンプトで program.c < filename と、「 < ファイル名」と入力された時と、そうでない時で分岐したのですがどうすればよいですか? お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとわかりにくかったですかね…。 「標準入力から読み込む」という風に作ってあれば、 標準入力をリダイレクトすることで >「< filename」と付いたときはfilenameからデータを読み込む >何も無い時は、標準入力でユーザーからデータを受け付ける という動作になります。 よって、「リダイレクトだったらファイル名を取得してオープンして~」とかの処理を入れる必要はありません。 OS(シェル)がその辺りのことはよろしく処理してくれます。 # ただし、リダイレクトされている状態から「途中でリダイレクトされていない状態に戻したい」とかいう場合は面倒です。 # < fileで入力をリダイレクトしていて、途中でキーボード(本来の標準入力)からの操作を行いたい。とか…… # クローズして開き直すことで戻せるでしょうが、その後でまたファイルのリダイレクトに戻す。なんてのは……。
その他の回答 (6)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
おそらくは、リダイレクトでファイル名を直接指定するのと、(ファイル名を表す)名前を指定するのとを使い分けたいということかなと思います。 まず、リダイレクト自体は、OS(というか、シェル)の管理下にあるので、環境変数を使えば良いのではないかなと思います。 といいつつ、手元には Windows しかないので、Windows だとたとえば、 a.out だと、標準入力から a.out < names.txt だと、names.txt の内容を入力に、 set fileName = names.txt という指定の元で、 a.out < %fileName% だと、fileName にセットされた、names.txt を入力に という動作をします。
- Wr5
- ベストアンサー率53% (2173/4061)
入力のリダイレクトなら… >「< filename」と付いたときはfilenameからデータを読み込む >何も無い時は、標準入力でユーザーからデータを受け付ける コード書かなくてもそういう風に動作するハズですが…… わざわざ区別する必要もないと思いますが、なにか不都合でもあるのでしょうか?
- KEIS050162
- ベストアンサー率47% (890/1879)
手元に、Cのコンパイラを実行できる環境がないので、取りあえずアドバイスだけですが、 リダイレクトを使うのではなく、コマンドライン引数を使えば、考えておられる様なことが出来ると思います。 参考: http://www9.plala.or.jp/sgwr-t/c/sec11-4.html http://lambda.phys.tohoku.ac.jp/~takahasi/ctext/ArgMain.pdf 要は、実行時にコンソールから渡された引数をチェックして、ファイル名に相当する引数がないか、そのファイルが存在しない(fopenの戻り値がNULLだったら、有効なファイルが存在しないなどでチェックできると思います)ならば、分岐して入力を促す、などの処理を組めばよいと思います。 取り急ぎ、ご参考まで。
- Tacosan
- ベストアンサー率23% (3656/15482)
ちなみにですが, なぜこれらを区別したいのでしょうか?
- Wr5
- ベストアンサー率53% (2173/4061)
環境に依存しますが…isatty()ですかねぇ。 コマンドプロンプトと言っているので、Windowsでしょうけど。 # コマンドプロンプトからtelnet.exeを使用してUNIX系端末に繋いでいる可能性も否定できないワケですが。 ただし…… >program.c < filename 「Cのソースファイル」は実行ファイルではありませんからリダイレクトできないと思います。
- f272
- ベストアンサー率46% (8627/18450)
何をやりたいのかがまったくわからないのですが... あなたの意図している結果はどのようなものですか?
補足
回答ありがとうございます。 「< filename」と付いたときはfilenameからデータを読み込む 何も無い時は、標準入力でユーザーからデータを受け付ける という感じに分岐したいと思っています。 よろしくおねがいします。
補足
回答ありがとうございます。 UNIX系のOSを想定しています。 あとa.outでした。すみません。 <filenameのfilenameの部分を変数に入れて、それで判定するっていう簡単なことは出来無いんですかね・・・。