みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

画面のテキストをファイル出力

画面に表示したテキストをファイルに出力する方法はありませんか。
fprintfを画面出力と同時に実行すればよいのですが、
fprintfをプログラムに追加していくとフローチャートを
書き直さなければならないので何か方法があれば教えてください。
お願いします。
環境 windows XP
borland c++ 5.5

投稿日時 - 2008-05-11 16:54:22

QNo.4014426

すぐに回答ほしいです

質問者が選んだベストアンサー

printf した出力は、プログラムを修正しなくともファイルに記録することは出来ますよ、ということはすでに回答し、質問者に伝わったと考えます。回答者のコメントは一旦これで区切りをつけたいと思います。

以下は、先程の解説への補足説明と追加質問への説明です。

> 教えていただいた方法で実行したところscanfを
> 用いた部分で改行されない問題が発生し上手く記録できませんでした。

(概要) 『改行されない』状況は仕様通りの動作です。stdin のデータに改行が含まれているが stdout には書きこまれていないということです。

(解説) scanf は標準入力 (stdin) から書式付きデータを読み込みます。一方 sample.exe > sample.log は、printf によって標準出力 (stdout) に書き込まれたデータを sample.log にリダイレクトするよう指示するものです。stdin のデータは sample.log にリダイレクトされません。

(例題) sample2.c は stdin から 3 つの数を受け取り scanf して printf するものです。ファイルにリダイレクトされた sample2.log には stdin のデータ (100 200 300 改行) は含まれていません。『数を 3 つ入力してください。> [100] [200] [300]』と繋がったようになります。

C:\borland>type sample2.c
#include <stdio.h>
main() {
  int i, j, k;
  printf("数を 3 つ入力してください。> ");
  scanf("%d %d %d", &i, &j, &k);
  printf("[%d] [%d] [%d]\n", i, j, k);
  return 0;
}
C:\borland>bcc32 sample2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample2.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\borland>sample2.exe
数を 3 つ入力してください。> 100 200 300
[100] [200] [300]

C:\borland>sample2.exe > sample2.log
100 200 300

C:\borland>type sample2.log
数を 3 つ入力してください。> [100] [200] [300]

C:\borland>

(対処案)

stdin のデータも scanf する前に printf するようにする。

---

> また、これはsystem()でプログラム中で実行はできないのでしょうか。

上記 sample2.exe > sample2.log を実行する invoke.c を実行した例をメモしておきます。

(実行例)

C:\borland>type invoke.c
#include <stdio.h>
#include <stdlib.h>

main() {
  system("c:\\borland\\sample2.exe > sample2.log");
  return 0;
}
C:\borland>bcc32 invoke.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
invoke.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\borland>invoke
400 500 600

C:\borland>type sample2.log
数を 3 つ入力してください。> [400] [500] [600]

C:\borland>

投稿日時 - 2008-05-11 21:35:02

お礼

回答ありがとうございます。
大変丁寧に回答していただいたおかげで
問題を解決することができました。
本当にありがとうございました。

投稿日時 - 2008-05-12 00:33:02

ANo.6

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

こんにちは。

プログラムの提示、ありがとうございました。『画面に表示したテキスト』というのは printf されたテキストという理解であっていますでしょうか。想像するに、コンソールアプリケーションとして Borland C++ でビルドされたアプリケーションがコマンドプロンプト (cmd.exe) 上でテキストを表示する。ashiato-li さんのいわれる画面表示とはそのように表示されたものでしょうか??

そうだという前提で進めますと・・・プログラムを修正しなくともコマンドプロンプトの機能を利用して printf されたテキストをファイルに保存できます。sample.exe > sample.log という所が該当箇所です。

(コマンドプロンプト上の実行例)

C:\borland>cd
C:\borland

C:\borland>type sample.c
#include <stdio.h>
main() {
    printf("\n---回帰曲線の方程式---\n");
    printf("y= ... \n");
    return 0;
}

C:\borland>bcc32 sample.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\borland>sample.exe

---回帰曲線の方程式---
y= ...

C:\borland>sample.exe > sample.log

C:\borland>type sample.log

---回帰曲線の方程式---
y= ...

C:\borland>

投稿日時 - 2008-05-11 18:53:18

補足

回答ありがとうございます。
教えていただいた方法で実行したところscanfを
用いた部分で改行されない問題が発生し上手く記録できませんでした。
また、これはsystem()でプログラム中で実行はできないのでしょうか。

投稿日時 - 2008-05-11 19:33:23

ANo.4

> 「テキストを画面表示する手続きを別な手続きに括りだす」というのは、ユーザー関数でまとめるということでしょうか。

はい、そうです。例示した DrawTextA/DrawTextW は Win32 API (user32.dll) で提供されているライブラリ関数です。ここでいう別な手続きはユーザ(質問者)が新規に定義する関数のことを意図しています。

テキストを画面表示(描画)するよう指示している箇所で fprintf したいものを洗い出して、外に括りだしてやります。どう括りだすのがよいかは、実際に指示している箇所を見ながら考えていくことになります。プログラムの該当箇所をここに提示して議論するのが望ましいでしょう。(切り出すポイントを正確に見極める必要があるため。)

実際に指示している箇所の提示は可能でしょうか??

投稿日時 - 2008-05-11 18:17:50

補足

解説ありがとうございます。
実際の処理部分を以下に示します

printf("\n---回帰曲線の方程式---\n");
if(mtr.solution[0]==0)
printf("y=");
else
printf("y=%f",mtr.solution[0]);
for(i=1; i<(mtr.row) ;i++){

if(mtr.solution[i]>0)
printf("+%fx^%d",mtr.solution[i],i);
else if(mtr.solution[i]<0)
printf("%fx^%d",mtr.solution[i],i);

}

投稿日時 - 2008-05-11 18:34:04

ANo.3

> fprintfをプログラムに追加していくとフローチャートを
> 書き直さなければならない

プログラムの仕様上、fprintf関数の実行を追加する必要があるのであれば、
フローチャートを書き直してでも実現させねばならないのではありませんか?

フローチャートを書き直すのがいや(あるいは煩わしい)から
プログラムに手を加えたくない、というのであれば、
それは本末転倒というものです。

投稿日時 - 2008-05-11 17:33:36

補足

回答ありがとうございます。
本末転倒だという、ご指摘は正しいと思います。
画面に表示した内容を取得する方法が分かれば将来的に
役に立つと思うので質問は続けさせていただきます。

投稿日時 - 2008-05-11 17:48:44

ANo.2

こんにちは。

テキストを画面表示する手続きを別な手続きに括りだすことは可能でしょうか?? DrawTextA などをハードコーディングしているような場合は一つずつ括りだすことになります。それが終われば、括りだした手続きに fprintf を加えるのは手間ではないでしょう。

プログラムの目的と位置づけによってはもう少し別な提案ができるかもしれません。(例えば、そのプログラムを変更せずとも外部から描画したテキストデータを取得するようなソフトウェアも公開されているからです。それを利用するのも場合によっては手です。)

投稿日時 - 2008-05-11 17:27:53

補足

回答ありがとうございます。
「テキストを画面表示する手続きを別な手続きに括りだす」というのは、ユーザー関数でまとめるということでしょうか。
できれば補足をお願いします。
また、プログラムを1つにまとめる必要があるので他のソフトを用いる方法はできません。

投稿日時 - 2008-05-11 17:44:17

ANo.1

fprintfと画面出力を同時に行う関数を作ればいいのでは?

投稿日時 - 2008-05-11 17:06:39

補足

回答ありがとうございます。
教えていただいた方法だと変数を含む文字列の場合、sprintfと
ユーザー関数の組み合わせとなりフローチャートの変更が難しいと
感じたのですが、1つの関数で可能なのでしょうか。

投稿日時 - 2008-05-11 17:17:25

あなたにオススメの質問