1. ホーム
  2. c

[解決済み] stdinが空かどうかを判断する方法

2022-03-04 19:48:28

質問

私は学校でちょっとしたプロジェクトを行うことになりました。迷路を生成するプログラムがあります。 引数を入れて別の迷路を生成したり、画像として取得することも可能です。

私たちはこのように呼んでいます。

<ブロッククオート

./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
}