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を使用しています。
はあなたの時間と労力をありがとうパイプに書き込まれるバイトストリームの長さは前もって知られていないので、
堂免
関連:[UNIX/Linux IPC:パイプからの読み込み。実行時にデータの長さを知る方法?](http://stackoverflow.com/questions/1151029/unix-linux-ipc-reading-from-a-pipe-how-to-know-length-of-data-at -runtime) –