3

テキスト ファイルの最初の文字を読み取るプログラムを作成しようとしています。使用./a.out myfile.txtすると意図したとおりに機能しますが、使用する./a.out <myfile.txtSegmentation fault: 11. を含めようとしている理由<は、これが割り当ての仕様にあるためです。以下のコードは、私が作成した単純な例であり、同じ問題があります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int func(int argc, char **argv){
    FILE *fp;
    int test = 0;
    fp = fopen(argv[1], "r");
    fscanf(fp, "%i", &test);
    printf( "current file: %s \n", argv[1]);


}


int main(int argc, char **argv){
    func(argc, argv);   
}

引数を として受け入れるようにする方法はあります<myfile.txtか?

4

3 に答える 3

7

いいえ、試してはいけません。この方法でリダイレクトされたファイルは に表示されるstdinので、代わりにそれを使用する必要があります (ヒント: check argc)。

于 2013-05-18T02:22:43.667 に答える
5

指定されている場合はファイルを使用するが、そうでない場合は標準入力を使用する場合は、次のようなものを使用します。

if (argc > 1)
    fp = fopen(argv[1], "r");
else
    fp = stdin;
于 2013-05-18T02:53:00.510 に答える
2

コマンド./a.out <myfileで、stdin を にリダイレクトしmyfileます。これは、stdin からの読み取りが実際には からの読み取りであることを意味しmyfileます。したがって、この場合は yourであるため、開くargc == 1ために使用するのは is (引数の仕様を参照)。名前を使用するとクラッシュします。argv[1]NULLmainfopenNULL

別の方法でユーティリティを実行することもできますstdin。入力するファイルが必要な場合は、次のようにしますcat myfile | ./a.out。これは非常に優れたアプローチであり、検討する価値があります。

于 2013-05-18T03:29:08.150 に答える