C言語関係掲示板

過去ログ

No775 他のプログラムの標準出力を、読み込みたい

[戻る] [ホームページ]
No.9600

標準出力の取り込み
投稿者---パンチ(2003/10/07 14:04:37)


標準出力をプログラムに取り込みたいのですが、

if((fpr = fopen("ファイル名", "rb")) == NULL){
printf("Read error!! \n");
exit(1);
}
というふうにやるのでしょうか?
それとも上記のようにファイルを読み込むのとは全く異なる方法なのでしょうか?
ちなみにデータはrbから分かるようにバイナリデータです。
OSはsoralisです

No.9610

Re:標準出力の取り込み
投稿者---物見遊山(2003/10/07 18:55:13)


リダイレクトやパイプではダメなの?

No.9611

Re:標準出力の取り込み
投稿者---かずま(2003/10/07 19:17:41)


> 標準出力をプログラムに取り込みたいのですが、

他のプログラムの標準出力を、読み込みたいのですよね。
    fp = popen("他のプログラム", "r");
       ....
    pclose(fp);


No.9662

Re:標準出力の取り込み
投稿者---パンチ(2003/10/09 10:24:08)


>> 標準出力をプログラムに取り込みたいのですが、
>
>他のプログラムの標準出力を、読み込みたいのですよね。

そーなんです。
そして、それのバイナリデータを数値データに直したいと考えてます。
数値データに直すにはどうしたら良いでしょうか?

パイプ(|)やリダレクト(>)といったのも使えれば(できればパイプ)と考えてます。

No.9666

Re:標準出力の取り込み
投稿者---物見遊山(2003/10/09 12:29:53)


od(1)を使うのはダメですか?
$ file a.out
a.out:      ELF 32-ビット MSB 実行可能形式 SPARC バージョン 1[動的にリンクされています][ストリップされていません]
$ cat a.out | od -xv
0000000 7f45 4c46 0102 0100 0000 0000 0000 0000
0000020 0002 0002 0000 0001 0001 076c 0000 0034
0000040 0000 1778 0000 0000 0034 0020 0005 0028
(略)
0015620 0000 0000 0000 0000 0000 163d 0000 013b
0015640 0000 0000 0000 0000 0000 0001 0000 0000
0015660
$


一応ソースも書いてみました。
#include <stdio.h>
#define MAX_LEN 16

int
main(int argc, char *argv[])
{
    int ret = 1;
    FILE *fp = stdin;
    unsigned char ar[MAX_LEN];
    size_t len;

    switch (argc) {
    case 2:
        fp = fopen(argv[1], "rb");
        if (fp == NULL) goto end;
    case 1:
        break;
    default:
        goto end;
    }

    while (0 < (len = fread(ar, sizeof(char), MAX_LEN, fp))) {
        int i;
        for (i = 0; i < len; i++)
            printf("%02x ", ar[i]);
        puts("");
    }
    fclose(fp);
    ret = 0;
end:
    return ret;
}



No.9667

Re:標準出力の取り込み
投稿者---パンチ(2003/10/09 12:48:57)


>od(1)を使うのはダメですか?

$ cmmand1 | cmmand2

って感じなのは自分も同じ考えなのですが、comman1でバイナリデータを
吐き出していてcommand2でそのデータを数値化してdatファイルに入れたいと考えてます。
一応昔演習等で使ったプログラムをいじりたいと思ってます。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 FILE *fp;
 int i;
  
  /*書き込みのためにファイルを開く*/
  if((fp = fopen("myfile.dat","wb"))==NULL){
    printf("can't open file\n");
    exit(1);
    }
  i=100;
  
  if(fwrite(&i,2,1,fp) !=1){
    printf("error\n");
    exit(1);
    }    
  fclose(fp);
    
  /*読み込みのためのファイルを開く*/  
  if((fp = fopen("myfile.dat","r"))==NULL){
    printf("can't open file");
    exit(1);
   }
   
   if(fread(&i,2,1,fp) != 1){
   printf("error\n");
   exit(1); 
   }
   
   printf("i is %d",i);
   fclose(fp);
   
   return 0;
}
とこんなのをいじりたいとおもってます。

No.9670

Re:標準出力の取り込み
投稿者---nop(2003/10/09 14:31:23)


>$ cmmand1 | cmmand2
>って感じなのは自分も同じ考えなのですが、comman1でバイナリデータを
>吐き出していてcommand2でそのデータを数値化してdatファイルに入れたいと考えてます。

cmmand1 … 標準出力に fgetc() などで 1 byte ずつ出力
cmmand2 … 標準入力を fgetc() などで 1 byte ずつ入力し、
      それを数値として出力

でよいのでは?

No.9671

Re:標準出力の取り込み
投稿者---物見遊山(2003/10/09 17:21:07)


>>od(1)を使うのはダメですか?
>$ cmmand1 | cmmand2

>って感じなのは自分も同じ考えなのですが、comman1でバイナリデータを
>吐き出していてcommand2でそのデータを数値化してdatファイルに入れたいと考えてます。
>一応昔演習等で使ったプログラムをいじりたいと思ってます。

$ command1 | od -xv > myfile.dat
ではダメなの?
あるいは、前の物見のレスに書いたソースをcommand2へコンパイルして
$ command1 | command2 > myfile.dat
とするのはダメなの?

No.9705

Re:標準出力の取り込み
投稿者---パンチ(2003/10/11 00:25:18)


すみません。
それでいいのでした。
m(_ _)m
助言くださってありがとうございました。

No.9751

Re:標準出力の取り込み
投稿者---パンチ(2003/10/14 00:34:27)


データは16ビット16KHzです。したがい、データはshortです。
freadは2バイトずつ、標準入力から読むようにする。

物見さんに教えていただいたod(1)をいろいろ試していたら上記の問題に
あたってしまいました。

プログラムの
#define MAX_LEN 16

unsigned short int ar[MAX_LEN];
size_t len;

の部分と

while (0 < (len = fread(ar, sizeof(char), MAX_LEN, fp))) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", ar[i]);
puts("");
}

の部分を書き換えればできると思うのですが?
実際どういったプログラムでどういった動作をするのかわかりません。
できればまた教えていただいきたいです。m(__)m

No.9756

Re:標準出力の取り込み
投稿者---物見遊山(2003/10/14 12:50:52)


>データは16ビット16KHzです。したがい、データはshortです。
>freadは2バイトずつ、標準入力から読むようにする。

標本化定理?やら周波数のことは物見には全然わかりません。
ですので、shortというところにだけレスします。

>プログラムの
>   #define MAX_LEN 16
>   
>    unsigned short int ar[MAX_LEN];
>    size_t len;
>
>の部分と
>   
>while (0 < (len = fread(ar, sizeof(char), MAX_LEN, fp))) {
>        int i;
>        for (i = 0; i < len; i++)
>            printf("%02x ", ar[i]);
>        puts("");
>    }
>
>の部分を書き換えればできると思うのですが?
正解(←みのもんた@ミリオネア風に)。

>実際どういったプログラムでどういった動作をするのかわかりません。
>できればまた教えていただいきたいです。m(__)m

実は物見が書いたソースには誤記があって
そのせいでパンチさんを混乱させてしまったかもしれません。
ゴメンなさい。

で。修正も含めてソースを・・・その前に。
uname(1)を使って動作環境のCPUを確認してみてください。
$ uname -p
sparc
$

で。"sparc"と出ればOKです。
x86やらIA32やらPentiumやらが出れば(←物見は見たことがない)
ソースは正しく動かないです。はい。
#『えんでぃあん』というヤツです。
#あるいはこの課題?を作成した人に
#「えんでぃあんは問題になりませんか?」とか聞いてみてください。

では・・・お待たせしました。ソースです。
#include <stdio.h>
#define MAX_LEN 8
typedef unsigned short my_t;

int
main(int argc, char *argv[])
{
    int ret = 1;
    FILE *fp = stdin;
    my_t ar[MAX_LEN];
    size_t len;

    switch (argc) {
    case 2:
        fp = fopen(argv[1], "rb");
        if (fp == NULL)
            goto end;
    case 1:
        break;
    default:
        goto end;
    }

    while (0 < (len = fread(ar, sizeof ar[0], MAX_LEN, fp))) {
        int i;

        for (i = 0; i < len; i++)
            printf("%04x ", ar[i]);
        puts("");
    }
    fclose(fp);
    ret = 0;
end:
    return ret;
}


・・・殆ど前のソースと変わってませんね。

あと。Solarisを使っているのであれば
man 3s freadとかすれば標準関数の使い方を
教えてくれます。
詳しくはman manして読んでください。ではでは。

No.9765

Re:標準出力の取り込み
投稿者---パンチ(2003/10/14 18:08:51)



>詳しくはman manして読んでください。ではでは。

man manしてみました。英語がブワーッってでてきました。
翻訳するのも結構骨がおれましたがなんとなく分かったような気がします。

ところで unsigned char int ar[MAX_LEN];からshort ar[MAX_LEN]と
単純に変更だけではいけないのでしょうか?
後半のwhileのsizeof(char)の部分をこれまた単純に2(byte)に変更では?

No.9769

Re:標準出力の取り込み
投稿者---物見遊山(2003/10/14 18:53:27)


>man manしてみました。英語がブワーッってでてきました。
>翻訳するのも結構骨がおれましたがなんとなく分かったような気がします。

#お疲れさまでした。m(__)m

>ところで unsigned char int ar[MAX_LEN];からshort ar[MAX_LEN]と
>単純に変更だけではいけないのでしょうか?
>後半のwhileのsizeof(char)の部分をこれまた単純に2(byte)に変更では?

shortではなく符号無しshort型ですね。
それ以外はパンチさんの仰るとおりです。

また、printfの第一引数を変えています。

No.9786

Re:標準出力の取り込み
投稿者---パンチ(2003/10/15 10:25:48)



重ね重ね助言して下さってありがとうごうざいました。
とりあえず意図したようにプログラムも動きましたので。

m(__ __)m ペコリ