3

未知の入力ソースからデータを読み取る方法を知りたかったのです。つまり、ユーザーが文章を入力するだけなのか、テキストファイルを提供してくれるのかわかりません。読んだので使っfscanfてみましたが、これはフォーマットされていない入力タイプ用です。これは私のコードです。ある種の入力(ファイルまたは文だけを取得して最初の単語のみを出力する)を取得する(echo bla bla bla)とします。このプログラムは次の目的で使用する必要があります。コマンドが次のようになることを意味する配管 :プログラムの使用方法には2つの方法があります。"int""int"

1.echo "blabla" | myprog 2  (number of words to print)
2.cat input.txt | myprog 2  (number of words to print)

問題のある行は16行目ですfscanf
。Thanks!を使用してみました。

  1 #include <stdio.h>
  2 #include <ctype.h>
  3 #include <string.h>
  4 #include <stdlib.h>
  5
  6
  7 int main(int argc, char *argv[]){
  8    char *words[32];
  9    int numofwords = atoi(argv[2]);
 10    int i=0;
 11    int len;
 12    char *word = malloc (32 * sizeof(char));
 13    char c;
 14   while (i<=numofwords){
 15    if ((c = getc (argv[1])) != EOF){
 16         fscanf(argv[1],"%s",&word);
 17         len = strlen (word);
 18         words[i] = malloc ((len+1) * sizeof(char));
 19         i++
 20    }
 21    printf(words[i]);
 22   }
 23   return 0;
 24 }
 25
4

3 に答える 3

4

私はあなたの必要性を正しく理解しているのかもしれません。

私はあなたのコードを修正しているのではなく、私自身のコードを書いています。

以下は、コンソールから読み取る単純なコードです。コード:main.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
    if(argc!=2){
        printf("\n wrong number of argument\n");
        exit(1);
    }
    int numofwords = atoi(argv[1]);
    char buffer[128];

    //printf("%d\n",numofwords);

    while(numofwords--){
        scanf("%s",buffer);
        printf("%s\n",buffer);
    }
    return 0;
}   

それはどのように機能しますか:

~$ gcc  main.c -o main  

実行する:

:~$ ./main 

wrong number of argument
:~$ ./main 2
grijesh
grijesh
yourname        
yourname
:~$ 

ご理解いただければ幸いです。プログラムは、コンソールから読み取り(スキャン)し、コンソールに出力するだけです。whileループは、コマンドライン入力を渡した回数だけ実行されます。

ここで、テキストファイルdumy.txtは入力ファイルです。

:~$ cat dumy.txt
yourname
myname
hisname
hername
:~$   

次に、コードを通じて達成したいことを確認します。

:~$ cat dumy.txt | ./main 2
yourname
myname
:~$   

通過したい場合echo

:~$ echo $'one\ntwo\nthree' | ./main 2
one
two
:~$   

これはあなたが欲しいですか?

そうであれば:

あなたが見逃していることはそれを理解しました:

[あなたのコード]

間違い1,2
あなたのfsacnfは2つの点で間違っています:

fscanf(argv[1],"%s",&word);  
  • 最初の引数は、タイプを渡す必要があるのは間違っているということですargv[1]。オリ・チャールズワース氏の答えで説明されているように。char*FILE*

  • 次に、から読み取る必要がありますstdin|オペレーターは、出力を最初のコマンドから2番目のコマンドにリダイレクトします。

間違い3、4、5、6
送信echo "blabla"することで、1つの刺し傷を送信するだけで、私と同じように行う必要があります(新しい行のエコー文字列に\ nを追加しました。また、エコー文字列はで始まる$ので、生として印刷されません文字列)。argv[1]エコーではない2番目の引数に従ってコードから読み取ることができるようにしますargv[2]。したがって、コードの次の行も間違っています。

int numofwords = atoi(argv[2]);   

コードのこの行を修正しました。

iゼロに初期化されますがi = 0、whileループ条件はですが<=、そうあるべきだと思います<

間違い7)完全なパスを渡さなければならないので
、コードの実行方法が間違っecho "blabla" | myprog 2ているため、プログラムがわかりません。mygrog私がしたように./main./現在のディレクトリを意味します。

これはあなたの質問についての私の見解です。ウィリアム・パーセル氏のコメントの回答も読んでください。

他にご不明な点がありましたらお知らせください。

于 2013-01-19T14:21:10.927 に答える
3

あなたの質問が正確に何であるかはわかりませんが、「ファイル入力とコンソール入力を同じように扱うにはどうすればよいですか?」と思います。

stdin標準入力)がすでに?FILE *つまりfscanf、「通常の」ファイルと同じように、最初の引数として渡すことができます。

FILE *normal_file = fopen(...);

// Read from normal file
fscanf(normal_file, "%d", &x);
// Read from stdin
fscanf(stdin, "%d", &y);
于 2013-01-19T13:34:26.123 に答える
3

別の選択肢は、代わりにファイル名を引数として渡すことです。

  1. エコー「ブラブラ」| myprog 2(印刷する単語数)
  2. myprog 2 input.txt(印刷する単語数)

次に、次のようにします。

  • argc == 1の場合、通常どおりに進み、stdin(stdinはFILE *)をfgetcまたは別の代替f*メソッドで処理します。
  • argc == 2の場合、argv [1]からファイル名を取得し、fopen(filename)を使用してFILE*を取得して処理します。

それ以外の場合は、Oliが言ったことを実行して最初の単語を取得し、fopenして処理関数に渡すか、fseek(stdin、SEEK_SET、0)を実行してstdinを処理関数に渡します。

于 2013-01-19T14:23:05.000 に答える