No.6ベストアンサー
- 回答日時:
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>
回答ありがとうございます。
大変丁寧に回答していただいたおかげで
問題を解決することができました。
本当にありがとうございました。
No.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>
この回答への補足
回答ありがとうございます。
教えていただいた方法で実行したところscanfを
用いた部分で改行されない問題が発生し上手く記録できませんでした。
また、これはsystem()でプログラム中で実行はできないのでしょうか。
No.4
- 回答日時:
> 「テキストを画面表示する手続きを別な手続きに括りだす」というのは、ユーザー関数でまとめるということでしょうか。
はい、そうです。例示した DrawTextA/DrawTextW は Win32 API (user32.dll) で提供されているライブラリ関数です。ここでいう別な手続きはユーザ(質問者)が新規に定義する関数のことを意図しています。
テキストを画面表示(描画)するよう指示している箇所で fprintf したいものを洗い出して、外に括りだしてやります。どう括りだすのがよいかは、実際に指示している箇所を見ながら考えていくことになります。プログラムの該当箇所をここに提示して議論するのが望ましいでしょう。(切り出すポイントを正確に見極める必要があるため。)
実際に指示している箇所の提示は可能でしょうか??
この回答への補足
解説ありがとうございます。
実際の処理部分を以下に示します
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);
}
No.3
- 回答日時:
> fprintfをプログラムに追加していくとフローチャートを
> 書き直さなければならない
プログラムの仕様上、fprintf関数の実行を追加する必要があるのであれば、
フローチャートを書き直してでも実現させねばならないのではありませんか?
フローチャートを書き直すのがいや(あるいは煩わしい)から
プログラムに手を加えたくない、というのであれば、
それは本末転倒というものです。
この回答への補足
回答ありがとうございます。
本末転倒だという、ご指摘は正しいと思います。
画面に表示した内容を取得する方法が分かれば将来的に
役に立つと思うので質問は続けさせていただきます。
No.2
- 回答日時:
こんにちは。
テキストを画面表示する手続きを別な手続きに括りだすことは可能でしょうか?? DrawTextA などをハードコーディングしているような場合は一つずつ括りだすことになります。それが終われば、括りだした手続きに fprintf を加えるのは手間ではないでしょう。
プログラムの目的と位置づけによってはもう少し別な提案ができるかもしれません。(例えば、そのプログラムを変更せずとも外部から描画したテキストデータを取得するようなソフトウェアも公開されているからです。それを利用するのも場合によっては手です。)
この回答への補足
回答ありがとうございます。
「テキストを画面表示する手続きを別な手続きに括りだす」というのは、ユーザー関数でまとめるということでしょうか。
できれば補足をお願いします。
また、プログラムを1つにまとめる必要があるので他のソフトを用いる方法はできません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Ubuntu22.04、nanoエディタの使い方について 2 2022/10/24 19:50
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/21 16:01
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(Microsoft Office) エクセルのマクロについて教えてください。 5 2023/01/21 09:39
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- その他(パソコン・スマホ・電化製品) 学校からGitHubのアカウントを作って事前学習として動画を見て、動画の通りに操作していたら、アカウ 4 2023/04/16 11:44
- 画像編集・動画編集・音楽編集 AfterEffectでのシャターの挙動がおかしい 1 2023/05/07 00:38
- Android(アンドロイド) Aloha Browser でダウンロードしたファイルをPCに転送するには? 1 2022/05/23 18:54
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
このプログラミングの問題を教...
-
Windows10でDOSゲーム
-
ラズパイ プログラム 自動起動 ...
-
SendKeysについて
-
vba GetAsyncKeyState関数について
-
system関数を使用してsuコマン...
-
プリントスクリーンをプログラ...
-
C言語 fork()について
-
MACで動く実行ファイルをWindow...
-
システム資源とは?
-
プログラム初心者です Pythonで...
-
プログラミング ソースコード
-
他のPC上にあるexeを、そのP...
-
プログラムを走らせる
-
コマンドプロンプト プログラム...
-
他の実行ファイルを実行するプ...
-
スクリプトって?・・・
-
RPG パラメーターについて
-
sleep()関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
プログラミング ソースコード
-
MACで動く実行ファイルをWindow...
-
なんかC言語でプログラム書いて...
-
sendkeysにてALT+CTRL+INSERTを...
-
他のPC上にあるexeを、そのP...
-
C言語で途中までしか、プログラ...
-
終了してもプログラムが実行し...
-
システム資源とは?
-
VBAで外部プログラムを非表示で...
-
VB上で実行中の無限ループの止め方
-
実行時エラー429
-
RPG パラメーターについて
-
C言語でフォルダを開く
-
プリントスクリーンをプログラ...
-
system関数を使用してsuコマン...
-
並列計算をしたときのシステム...
-
プログラムを走らせる
-
clock関数は正確じゃないの?
-
このプログラミングの問題を教...
おすすめ情報