2017-12-07 2 views
0

私が端末に入力したものを取り込み、ファイルに書き込むプログラムを作成したいと思います。ここに私が書いたコードがあります。stdinをファイルにリダイレクト

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
int fd[2]; 
void pri(){ 
    char a[10]; 
    int ad=open("t.txt",O_CREAT | O_APPEND | O_NONBLOCK | O_RDWR, 0644); 
    if(read(fd[0],a,10)>0){ 
     write(ad,a,10); 
    } 
} 
int main() 
{ 
    int a; 
    char s[10]; 
    pipe(fd); 
    while(read(0,s,10)>0){ 
     write(fd[1],s,10); 
     pri(); 
    } 
    return 0; 
} 

現在、私はこれを達成するために配列とパイプを使用しています。配列を使用せずに同じことを達成できる方法はありますか?

+3

パイプと標準入力/出力の仕組みを誤解しているようです。おそらくあなたは解決しようとしている*実際の問題について詳しく説明することができますか? *なぜ標準*入力*をファイルに書き込む*にリダイレクトしたいのですか? –

+1

'dup2'からの戻りコードを確認しましたか? – bruceg

+0

'O_RDONLY'(読み込み専用)モードで' t.txt'を間接的にオープンしました.-古典的には0ですので、 'O_WRONLY'と' O_RDWR'の両方を省略すると 'O_RDONLY'を指定するのと同じです。したがって、ファイルへの書き込みに問題があります。しかし、他の概念上の問題、特に「パイプに書いているもの」(短い答えが「何もない」)があります。何もパイプに書き込むことなく、パイプの書き込み終了がまだ開いていると、読み取りは無期限にハングします。 'dup2()'コールは、事をさらに混乱させるだけです。 –

答えて

1

端末に入力したものをファイルに書き込むプログラムを作成したいと思います。

これは実際には非常に簡単で、このためにパイプは必要ありません。 (アプリケーション自体は、パイプの役割を果たします。)

これは私がこれを証明するために何をしたかである:mycat.c

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    if (argc < 2) { 
    fprintf(stderr, "ERROR: No output file!\n"); 
    fprintf(stderr, "Usage: mycat FILE\n"); 
    return 1; 
    } 
    FILE *fOut = fopen(argv[1], "w"); 
    if (!fOut) { 
    fprintf(stderr, "ERROR: Cannot open file '%s' for writing!", argv[1]); 
    } 
    int c; 
    while ((c = getc(stdin)) >= 0) { 
    if (putc(c, fOut) < 0) { 
     fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]); 
    } 
    } 
    if (fclose(fOut)) { 
    fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]); 
    } 
    return 0; 
} 

それはstdinから文字を読み取り、されているファイルストリームfOutに書き込みを以前はfopen()で公開されました。これは、getc()が失敗するまで繰り返されます。入力の終了のために。 Cygwinの/ Windowsの10のBashで

サンプルセッション:

$ gcc --version 
gcc (GCC) 6.4.0 

$ gcc -std=c11 -o mycat mycat.c 

$ ./mycat 
ERROR: No output file! 
Usage: mycat FILE 

$ ./mycat mycat.txt 
Hello World. 
tip tip tip 

この時点では、私はbash入力の終わりを知らせるためにはCtrl +Dを入力しました。

$ cat mycat.txt 
Hello World. 
tip tip tip 

$ 

私は出力にmycat.txtの内容をcatを使用。以前に入力したものです(期待どおり)。

cat私が質問を読むと、実際に私の最初のアイデアでしたが、私は考えました:それはではない)というタグの質問です。したがって私のCサンプルコード。

完全性については

catと同じ:

$ cat >mycat.txt <<'EOF' 
> Hello cat. 
> key key key 
> EOF 

$ cat mycat.txt 
Hello cat. 
key key key 

$ 

これは<<'EOF'bashによって解釈何かであることを私を思い出しました。そこで、以下では、同様に動作します

$ ./mycat mycat.txt <<'EOF' 
Hello World. 
tip tip tip 
EOF 

$ cat mycat.txt 
Hello World. 
tip tip tip 

$ 

順番にリダイレクトされる可能性があります、それは引数(S)として、入力ファイル(複数可)を取り、stdoutへの書き込みもののcatは(非常に似ていますことを、この私に聞かせて信念シェルで呼び出すとき)。鉱山に反対すると、catは引数が与えられていないと失敗しません。– stdinから読み込みます。

0

私が端末に入力したものをすべて取り出し、ファイルに書き込むプログラムを作成したいと思います。 =>可能ですが、それに応じてdup()またはdup2()close()システムコールを使用してください。これが唯一のタスクである場合には、通信B/W子のいずれかの種類を行っていないので、私はあなたがちょうどそうpipe()ファイルにユーザーの入力をリダイレクトしたいわけ入力のリダイレクトタスクのpipeを使用することの必要性が不要である何

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

     close(1);//so that it should not print anything on console 
     int ad=open(argv[1],O_CREAT | O_APPEND | O_NONBLOCK | O_RDWR, 0644); 
     // now ad is available file descriptor which is 1 
     if(ad == -1){ 
       perror("open"); 
       return 0; 
     } 
     while(read(0,&c,1)>0){ 
       write(ad,&c,1); 
     //when you don't want to take any input further press ctrl+d that will first save the data 
     } 
     return 0; 
} 

または親プロセス。

関連する問題