[解決済み] stdinが空かどうかを判断する方法
質問
私は学校でちょっとしたプロジェクトを行うことになりました。迷路を生成するプログラムがあります。 引数を入れて別の迷路を生成したり、画像として取得することも可能です。
私たちはこのように呼んでいます。
<ブロッククオート./test
または
./test --arg1 val --arg2 val --etc
このようにstdinに入れるファイルに引数をパースするように言われています :
./test < args.txt
さて、私は上記の行の一つ一つでプログラムを呼び出せるようにしなければなりません。引数のある行はうまくいき、標準入力にプログラムがある行はうまくいきますが、何もない行はもううまくいきません。
つまり、ユーザーが標準入力に何らかのファイルを送ってきたかどうかを確認し、そのファイルを使ってプログラムを呼び出し、それ以外の場合は通常の方法で呼び出します。私はfeofで試してみましたが、stdinはeofでさえも何も持っていないので、それはうまくいきません。 引数やファイルなしでプログラムを呼び出すと、ユーザーが何かを書き込むのを待ちますが、これはいけないことです。
基本的に私のコードは以下のようになるはずです。
int main()
{
int v;
if (stdin!=NULL)) { //if a file has been passed "./test <test.txt"
scanf("%d",&v);
}
else { //if no files has been passed "./test "
printf("no file forwarded \n");
return 1;
}
if (v<50) {
printf("you drive slow\n");
}
else {
printf("you drive fast\n");
}
return 0;
}
しかし、明らかに
(stdin != NULL)
はうまくいきません。では、stdinに何か入っているかどうかを確認する方法はあるのでしょうか?
クラスメートに聞いたところ、そのうちの一人は、fgetcを使って最初のcharを取得し、本当にcharがあればそれを戻すというようなことを教えてくれましたが、私がfgetcを使おうとすると、charがなければcharを入れるのを待つのです。
では、stdinが空なのか、そこにファイルがあるのかを(新しいライブラリを使わずに)確認するにはどうしたらいいでしょうか?
よろしくお願いします。 いってらっしゃい
私はネイティブスピーカーではありませんし、技術的な質問なので少し難しいのですが、もし私が完全に理解していなければ教えてください。
どのように解決するのですか?
コマンドラインから与えられた引数、またはファイルからパイプで渡された引数に基づいてプログラムを実行したいようですね。もしそうなら、まずコマンドラインで引数が指定されているかどうかを確認する必要があります。
if (argc > 1) {
//parse argv
}
そして、stdinが空であるかどうかをチェックし、空でなければstdinから引数を読み込む。
else if ((fseek(stdin, 0, SEEK_END), ftell(stdin)) > 0)
{
rewind(stdin);
char buffer[1024];
fgets(buffer, 1024 , stdin);
//parse args read in from stdin
}
else
{
//no redirection
}
関連
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み] テスト
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】malloc():メモリ破壊
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】配列型char[]が代入できない [重複]。