2

Unix コマンド ラインでは、入力リダイレクトを使用して入力ファイルを指定する必要があります。

./a.out < filename

ここに私のソースコードがあります:

    int main(int argc, char *argv[]) {

            char fileName[30];

            fgets(fileName, sizeof fileName, stdin);

            printf("%s\n", fileName);
    }

プログラムは、ファイル名の代わりに整数を出力します。を使用しても同じ結果が得られますscanf("%s", fileName);

私のgoogle-fuは失敗しました。私は何を間違っていますか?

編集:入力リダイレクト(<具体的には)を使用する必要があるため、コマンドライン引数はオプションではありません。ただし、実際にファイル名を知る必要はありません。ファイルから改行で区切られた整数を読み取るだけで済みます。私は間違った質問をしているようです。

4

3 に答える 3

4

ファイルから改行で区切られた整数を読み取るだけです。私は間違った質問をしているようです。

シェルの入力リダイレクト演算子 は<、指定されたファイルをプログラムの標準入力に関連付けます。プログラムは、ファイルを開くために特別な操作を行う必要はありません。ファイルは既に開かれています。ユーザーがキーボードで入力しているかのように、入力から読み取るだけです。

/* foo.c */
#include <stdio.h>
int main(int ac, char **av) {
  int i;
  while(scanf("%d", &i) == 1) {
    printf("Got one!: %d\n", i);
  }
  return 0;
}

プログラムをコンパイルします。

cc foo.c

そして、次のように実行します。

a.out < filename
于 2012-10-10T15:01:33.607 に答える
3

アプリが認識するのは開いているファイル記述子だけなので、リダイレクトされたストリームからファイル名を取得する(簡単な)方法はありません。Linuxでのみ機能する「難しい」方法がありますreadlink("/proc/self/fd/0")

ファイル名を知っている必要がある場合は、通常の引数(./a.out filename)として渡し、argv[1]入力リダイレクトを使用する代わりに確認してください。

ただし、ファイルを読みたいだけなので(ファイル名は気にしないで)、stdinすでに行っているようにから読みます。

于 2012-10-10T14:57:20.183 に答える
1

stdinを介してプログラムにファイル名を渡そうとしているようです。この場合filename、文字列ではなくファイルである必要があります。必要なのは、必要なファイル名をコマンド引数(./a.out filename)として渡すだけで、プログラム内でそれをから抽出することargvです。

于 2012-10-10T14:57:02.397 に答える