C言語関係掲示板

過去ログ

No.586.標準出力をファイルに出力するには?

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

標準出力をファイルに出力するには?
投稿者---けん(2003/03/07 18:02:02)


Win2K
コンソールアプリです。宜しくお願いします。

/* test.c */
if(CreateProcess( NULL,argv[1], NULL, NULL, FALSE, NULL, NULL, NULL,&si, &pi)){
 printf("起動に成功\n");
}else {
 printf("起動に失敗");
}
printf("\n終了\n");
--------------------------------------------------------

CreateProcessで起動するAP(hellow.exe)は、hellowを標準出力する簡単な
プログラムです。

test.exe hellow.exeとコマンド入力実行させると
起動に成功
hellow
終了
と言うような感じに標準出力されます。

test.exeの標準出力,起動したAP(hellow.exe)からの標準出力をファイル名で指定した
ファイルに出力したいのですがどのようにして良いのかわからず苦労しています。
test.exe hellow.exe ファイル名のような感じのコマンド入力イメージです。
ご教授宜しくお願いします。



No.5542

Re:標準出力をファイルに出力するには?
投稿者---ともじ(2003/03/08 15:28:15)


こんにちは。

>test.exeの標準出力,起動したAP(hellow.exe)からの標準出力をファイル名で指定した
>ファイルに出力したいのですがどのようにして良いのかわからず苦労しています。

リダイレクションを使って、

 test.exe hellow.exe > ファイル名

と、コマンド入力実行では、ダメでしょうか。

No.5543

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/08 17:56:12)


早速の返事ありがとうございます。

>リダイレクションを使って、
>
> test.exe hellow.exe > ファイル名
>
>と、コマンド入力実行では、ダメでしょうか。

やはり、プログラムにすることは出来ないのでしょうか?
よろしくお願いします。


No.5545

Re:標準出力をファイルに出力するには?
投稿者---forest water(2003/03/09 00:45:14)


freopen() で stdoutを普通のファイルに再割り当てすれば可能です。


No.5548

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/10 09:52:43)


いろいろとありがとうございます。

>freopen() で stdoutを普通のファイルに再割り当てすれば可能です。

調べてみます。
また、わからない場合、宜しくお願いします。


No.5551

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/10 14:40:08)


教えていただいたfreopenを使用してみましたが・・・

/* test.c */
if (freopen("OUTPUT", "w", stdout) == NULL){
 fprintf(stderr, "標準出力へのリダイレクトエラー\n");
}
if(CreateProcess( NULL,argv[1], NULL, NULL, FALSE, NULL, NULL, NULL,&si, &pi)){
 printf("起動に成功\n");
}else {
 printf("起動に失敗");
}
printf("\n終了\n");
fclose(stdout);

としてtest.exe hellow.exeとコマンド入力実行させると

起動に成功

終了

とOUTPUTファイルに書き込まれますが起動させたhellow.exeからの
標準出力分(hellow)は残念ながら書き込みされませんでした。

起動に成功
hellow
終了

としたいのですがやはり無理なのでしょうか?
ご教授宜しくお願いします。

*CreateProcessで起動するAP(hellow.exe)は、hellowを標準出力する簡単な
 プログラムです。


No.5552

Re:標準出力をファイルに出力するには?
投稿者---たか(2003/03/10 17:45:23)


test.exe と hellow.exe の stdin構造体は別のメモリ空間を参照して
いると思われますので、freopen()の結果はtest.exe内でのみ有効である
と思います。
hellow.exe内で改めてfreopen()を実行する必要があります。

No.5553

Re:標準出力をファイルに出力するには?
投稿者---たか(2003/03/10 17:46:16)


すみません、stdin ではなくて stdout でした。
hellow.exe内で stdout を freopen() して下さい。

No.5554

Re:標準出力をファイルに出力するには?
投稿者---pie(2003/03/10 19:56:14)


試したことないのでわかりませんが、
CreateProcessの第5引数をTRUEにしてもダメですか?

もしダメなら、CreateProcessじゃなくてpopenを使うという方法もあり。
つまり、hellow.exeの標準出力を、test.exeにパイプで結びつける方法です。
この場合test.exeでパイプからの入力を読み込んでそれを標準出力に書き出す処理が必要になります。
二度手間といえば二度手間ですけど。


No.5558

Re:標準出力をファイルに出力するには?
投稿者---たか(2003/03/10 23:49:04)


>試したことないのでわかりませんが、
>CreateProcessの第5引数をTRUEにしてもダメですか?

// handle inheritance flag
というのがWin32 Helpの中にありますね。
ちょっと試してみます。

No.5559

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/11 08:43:20)


いろいろご教授ありがとうございます。

>>試したことないのでわかりませんが、
>>CreateProcessの第5引数をTRUEにしてもダメですか?

私もちょっと試してみたのですが駄目でした。

>もしダメなら、CreateProcessじゃなくてpopenを使うという方法もあり。

起動したプロセスを持っていたいのでCreateProcessでと
思っています。何かいい方法はないでしょうか?

宜しくお願いします。


No.5560

Re:標準出力をファイルに出力するには?
投稿者---pie(2003/03/11 14:39:22)


こちらでも試してみました。

CreateProcessの第5引数をTRUEにすることに加え、
以下のようにSTARTUPINFOを設定すればOKです。

si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);


No.5561

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/11 20:07:14)


pieさん、こんばんわ。お世話になります。

>CreateProcessの第5引数をTRUEにすることに加え、
>以下のようにSTARTUPINFOを設定すればOKです。

教えていただいたようにやってみましたが起動させた
プロセスの標準出力が取れませんでした。
STARTUPINFOの設定場所を変えてみたりもしたのですが
ダメでした。
申し訳ありませんがどこが違うのでしょうか?
宜しくお願いします。
int main( int argc, char *argv[] ){
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 si.cb = sizeof(STARTUPINFO);
 si.lpReserved = NULL;
 si.lpDesktop = NULL;
 si.lpTitle = NULL;
 si.dwFlags = STARTF_USESTDHANDLES;
 si.cbReserved2= 0;
 si.lpReserved2= NULL;
 si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
 si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
 if (argc == 2) {
  if (freopen("OUTPUT.txt", "w", stdout) == NULL){
   fprintf(stderr, "標準出力へのリダイレクトエラー\n");
  }
  if(CreateProcess( NULL,argv[1], NULL, NULL, TRUE, NULL, NULL, NULL,&si, &pi)){
   printf("起動に成功\n");
  }else {
   printf("起動に失敗");
  }
  printf("\n終了\n");
 }
 fclose(stdout);
 return 0;
}



No.5562

Re:標準出力をファイルに出力するには?
投稿者---pie(2003/03/12 01:40:17)


GetStdHandleするのはfreopenしたあとでないと意味ありません(^^;

あと、これは関係ないですが、
> fclose(stdout);
じゃなくて、freopenしたFILE*を覚えておいて、それをfcloseしてください。


No.5563

Re:標準出力をファイルに出力するには?
投稿者---pie(2003/03/12 01:42:34)


蛇足ながら、fcloseは外側のif節の中にあるべきかと。

No.5566

Re:標準出力をファイルに出力するには?
投稿者---けん(2003/03/12 17:43:42)


pieさん、ご教授ありがとうございます。
しかし、残念ながら・・・

>> fclose(stdout);
>じゃなくて、freopenしたFILE*を覚えておいて、それをfcloseしてください。
FILE *stream;
stream = freopen("OUTPUT.txt", "w", stdout);
fclose(stream);
ってことですか?

もしよろしければ、ソース載せていただけないでしょうか?
嘆かわしいお願いですがよろしくお願いします。

No.5577

Re:標準出力をファイルに出力するには?
投稿者---pie(2003/03/13 14:23:49)


>pieさん、ご教授ありがとうございます。
>しかし、残念ながら・・・

うまくいかなかったんですか?

>FILE *stream;
>stream = freopen("OUTPUT.txt", "w", stdout);
>fclose(stream);
>ってことですか?

そうです。

>もしよろしければ、ソース載せていただけないでしょうか?
>嘆かわしいお願いですがよろしくお願いします。

いや、ですからGetStdHandleをfreopenの後にしただけですけど。

#include <windows.h>
#include <stdio.h>

int main( int argc, char *argv[] ){
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 FILE* fpredir;

 if (argc == 2) {
  if (( fpredir = freopen("OUTPUT.txt", "w", stdout)) == NULL){
   fprintf(stderr, "標準出力へのリダイレクトエラー\n");
  }

  si.cb = sizeof(STARTUPINFO);
  si.lpReserved = NULL;
  si.lpDesktop = NULL;
  si.lpTitle = NULL;
  si.dwFlags = STARTF_USESTDHANDLES;
  si.cbReserved2= 0;
  si.lpReserved2= NULL;
  si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  si.hStdError = GetStdHandle(STD_ERROR_HANDLE);

  if(CreateProcess( NULL,argv[1], NULL, NULL, TRUE, 0, NULL, NULL,&si, &pi)){
   printf("起動に成功\n");
  }else {
   printf("起動に失敗\n");
  }
  printf("\n終了\n");
  fclose(fpredir);
 }

 return 0;
}