2016-12-01 7 views
0

catコマンドを使用して、バイナリデータを自分のプログラムにstdin(0)で読み込もうとしています。私のプログラムの仕事は、バイナリを整数またはdoubleに変更し、それを目的のファイル記述子に書き出すことです。

私はコマンド:cat data_int.bin | ./myprogram -dを実行すると、何も読み取ることができず、入力のサイズも0です。しかし、私が試したときに:./myprogram -d -I 0 0<data_int.bin、私のプログラムはバイトを読み込み、正常に終了します。


マイコード:
Linuxでcatコマンドを使用してstdinでバイナリデータを読み取る

#libraries 

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

     int c; 
     extern char *optarg; 
     extern int optind; 
     extern int optopt; 

     char input_file[100] = { 0 }; 
     int nastavljen_input = 0; 
     char output_file[100] = { 0 }; 
     int nastavljen_output = 0; 
     int tip = -1; // 0 - char, 1- int, 2 - double 
     int fd_in = 0; 
     int fd_out = 1; 
     while((c = getopt(argc,argv, ":o:i:O:I:cdf")) != -1) { 
      switch(c) { 
       case 'o': 
        strcpy(output_file,optarg); 
        nastavljen_output = 1; 
        fd_out = open(output_file,O_WRONLY); 
        break; 
       case 'i': 
        strcpy(input_file,optarg); 
        nastavljen_input = 1; 
        fd_in = open(input_file,O_RDONLY); 
        break; 
       case 'O': 
        fd_out = atoi(optarg); 
        break; 
       case 'I': 
        fd_in = atoi(optarg); 
        break; 
       case 'c': 
        tip = 0; 
        break; 
       case 'd': 
        tip = 1; 
        break; 
       case 'f': 
        tip = 2; 
        break; 
      } 
     } 

     if(tip > -1) { 
      struct stat st; 
      fstat(fd_in, &st); //fd_in would be 0 with cat command 
      int size = st.st_size; // number of bytes in input file 
      printf("%d\n",size); // this will print out 0 with cat command 

      unsigned char buffer[size]; 
      read(fd_in,buffer,size); 

      ...code continues... 



フラグ-dは整数を表す読み込むバイトのためのものであり、-Iは、入力ファイルディスクリプタを選択するためです。この場合、出力はstdout(1)です。

私の質問には、私のコードに問題がありますか?これはちょうどcatコマンドが機能するかどうかです。私はXubuntuを使用しています。

はあなたの時間と労力をありがとうパイプに書き込まれるバイトストリームの長さは前もって知られていないので、
堂免

+1

関連:[UNIX/Linux IPC:パイプからの読み込み。実行時にデータの長さを知る方法?](http://stackoverflow.com/questions/1151029/unix-linux-ipc-reading-from-a-pipe-how-to-know-length-of-data-at -runtime) –

答えて

1

パイプは常に、st_size 0を持っています。

cat foo | progprog < fooには異なる動作をするプログラムが多数あります。これがまさにその理由だ。 2番目のケースでは、progに標準入力ファイルがあるので、statはサイズを示します。 2番目のケースでは、lseek/fseekが動作し、パイプ上では動作しません。

stdinの内容をバッファに読み込み、stdinがパイプのときに動作させる必要がある場合は、そのサイズを推測してから、どのくらい読み込んでいるかを把握する必要がありますあなたはメモリが足りなくなり、さらにいくつかを割り当てます。 reallocはこれに適しています。

+0

バッファサイズを20に変更し、nbytesを20に変更しました。まだ何も得られません... 20はバイナリファイルの完全サイズです。 –

+0

@domenkavran「nbytesを20に読み込む」とはどういう意味ですか? –

+0

ssize_t read(int fildes、void * buf、size_t nbyte) - nbyteを20に設定し、bufferのサイズをbuffer [20]に設定しました。 –

関連する問題