2017-11-16 25 views
3

私は学校のために少しプロジェクトがあります。私たちは迷路を生成するプログラムを持っています。 別の迷路を生成する引数を入れることも、画像として取得することもできます。stdinが空であるかどうかを調べる方法

我々はそのようにそれを呼び出す:

./test

または

./test --arg1ヴァル--arg2ヴァル--etc

引数を、次のようにstdinに入れたファイルに解析するように求められました。

./test <

args.txt今、私は上記の行のすべてのいずれかでプログラムを呼び出すことができなければなりません。引数のある行は動作し、stdinのプログラムの鉱山が動作しますが、何もない行はもう動作しません。

私は、ユーザーが標準のファイルを送信したかどうかを確認する必要があります。私はファイルでプログラムを呼び出します。それ以外の場合は通常の方法です。私は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に何かがあるかどうかを確認する方法はありますか? 私はクラスメートに尋ねましたが、そのうちの1人はfgetcを使って最初のcharを取得し、実際にcharがあればそれを返すと言っていましたが、fgetcを使用しようとするとcharがなければputを待ちます

私はstdinが空であるかどうか、またはファイルがあれば(新しいライブラリを使用しないで)どうすれば確認できますか?

事前 のおかげであなたは良い一日

を持って、私は完全に明確ではないです場合、私はネイティブスピーカーではないよ私にそれを教えてください、それは技術的な質問

答えて

1

ですので、私は、困難のビットを持っていますコマンドラインで提供された引数に基づいてプログラムを実行したり、ファイルから引き渡されたりするように思えます。もしそうなら、あなたは最初の引数にコマンドラインで提供されているかどうかを確認する必要があります

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 
} 
+0

stdinはeofを持たないため、常に0を返します。 私は引数なしで、引数またはファイルでプログラムを呼び出せます 現時点では引数またはファイルでしか呼び出せません – Rekch

+0

引数なしで呼び出すと、 'argc '。ファイルに './test mnistic

+0

私はそれはおそらく、私はもう一度 を試してみましょう、それをmissusingよ全く動作does notのFEOFをしようとしたとき、私は、引数と頼めば、それは罰金 の作品私は feofを使用するときに、より正確にはサンプルコード で私の質問を編集しました私がファイルを尋ねると、それはうまく動作します 引数なしで尋ねるか、入力を待っているファイル(それは大文字小文字ではありません) ファイルを置くと!feof(stdin)return 0、そして私はしないときそれも0を返します – Rekch

1

:STDINが空であるかどうかを確認し、その後

if (argc > 1) { 
    //parse argv 
} 

、および標準入力からで引数を読んでいない場合私は外部ライブラリを使用すべきではないので、それは最高のものではない解決策を見つけましたが、今のところうまくいきます。

feofは良いアイデアでしたが、実際にはうまくいかなかった理由は、あなたが何も書かなければstdinはEOFを持っていないということです。あなたはそれが中でどのようなユーザータイプを解析しようとするファイルがないときは、ファイルを解析しなければならないので、ファイル。最初

を提供する場合ので、あなたはその後、

#include <unistd.h> 

int v; 
    if (!isatty(STDIN_FILENO)) //if stdin is not a terminal (a file was provided) 
    { 
     scanf("%d",&v); 
    } 
    else { //if stdin is a terminal (no file provided) 
     printf("no file forwarded \n"); 
     return 1; 
    } 
    if (v<50){printf("you drive slow\n");} 
    else {printf("you drive fast\n");} 
    return 0; 
含まれている必要があります

stdinが端末かどうかを確認します。 このソリューションは機能しますが、誰かが外部ライブラリを使用していない場合は、すばらしいです!

標準入力が空であるかどうかを判断する方法
0

(?)

getchar()で1つの文字を読み込みます。

int ch = getchar(); 
if (ch == EOF) { 
    if (feof(stdin)) puts("stdin empty"); 
    else    puts("stdin error"); // very rare 
} else { 
    ungetc(ch, stdin); // put back 
    puts("stdin not empty"); 
} 
関連する問題