C&C++でプログラムしています。
(以下は、できれば、Cの範囲内で行いたいと思います。)
結果の出力を画面とファイル両方に出力しています。
printf("A");
...
printf("Z");
fprintf(fp,"A");
...
fprintf(fp,"Z");
ただし、行数が多い場合には、ほとんど同じプログラムがだぶって書いてあり、画面用50行、ファイル出力用50行で、計100行とプログラム行数も長くなってしまいます。
サブルーチン化するなどの方法で、この2つのルーチンを短く記述することは、できないでしょうか?
例えば、
画面に出力する場合には、
fprintf(fp1,"***");
ファイルに出力する場合には、
fprintf(fp2,"***");
として、どちらに出力するかによってファイル指定子を変更できると良いのですが、可能でしょうか?
よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
No4です。
(全然、「美しくない」=「プログラム的でない」と思いますが・・★ご要望を尊重して・・・、ブツブツ・・)
#include <stdio.h>
FILE *fgFile;
void OrgPrn( char cStr[], int iVal )
{
char cFormat[64];
sprintf( cFormat, "%s%20d\n", cStr, iVal ); // ★出力フォーマットの一元化
fprintf( stdout, cFormat );
fprintf( fgFile, cFormat );
}
void main()
{
int nline = 1, C = 2, Nelm = 3, Nquad = 4, Ntria = 5, Nbeam = 6, Nbar = 7;
fgFile = fopen( "Test.txt", "w" );
OrgPrn( "Total Number of Line__= ", nline );
OrgPrn( "Total Number of Node__= ", C );
OrgPrn( "Total Number of Element = ", Nelm );
OrgPrn( "Total Number of CQUAD4_= ", Nquad );
OrgPrn( "Total Number of CTRIA_ = ", Ntria );
OrgPrn( "Total Number of CBEAM_ = ", Nbeam );
OrgPrn( "Total Number of CBAR__= ", Nbar );
fclose( fgFile );
}
注:インデントに全角空白を用いています(エディタでタブコードに)。
☆やっぱ、データとプログラムは別々に・・ぶつぶつ・・(しつこい)。
年寄りの鼻水じゃなかった、年寄りの◇◇水・・・?、残念。
お忙しいところご教示ありがとうございました。
おかげさまで、プログラムの行数が半分程度になって、すっきりすることができました。どうもありがとうございました。stdoutについては、他の変数に入れられないので、そのまま使うしかないものと理解しました。
全然、美しくないプログラムとのお叱りを受けており、今後、精進して、改善していきたいと思います。
今後ともよろしくお願い致します。
No.4
- 回答日時:
★根本的に、《考え方or発想》を変えたら如何でしょう。
質問者様は、50行分のテキストデータを、プログラムソース中にダブルコーテーションで括って入力しようとしています。
まず、このテキストデータのみを、ex)hoge.txt とファイル化すればいいのでは・・・(キーボードから入力する手間は同じ)。
そしてプログラムは、これを読み込んで「画面に出力する」機能にすればよいのでは。
要約すると、質問者様は、
『プログラムで、◆表示しながらファイルを◆作成する』
ですが、私の提案は、
『あらかじめ◆作成したファイルを、プログラムで、読み込み◆表示する』です。
★この方法で、なさろうとしている事に、不具合がありましたら補足願います。
・なさろうとしている事を具体的に。
・不具合を具体的に。
以上、2点補足をお願いします。
この回答への補足
私の説明がうまくできなくて申し訳ありません。
入力ではなくて出力しようと思っています。
下記のような感じで、標準出力とファイルの2カ所に出力したいと思っており、今の状況ですと、ファイルポインタを
fp=stdoutとfp=fp2(ファイルポインタ)で変更すれば、短い行数で重複することなく、できるのではないかと思っていますが、いかがでしょうか?
fprintf(fp,"Total Number of Line = %20d\n",nline);
fprintf(fp,"Total Number of Node = %20d\n",Ngrid);
fprintf(fp,"Total Number of Element = %20d\n",Nelm);
fprintf(fp,"Total Number of CQUAD4 = %20d\n",Nquad);
fprintf(fp,"Total Number of CTRIA = %20d\n",Ntria);
fprintf(fp,"Total Number of CBEAM = %20d\n",Nbeam);
fprintf(fp,"Total Number of CBAR = %20d\n",Nbar);
以前は、これに、
printf("Total Number of CBAR = %20d\n",Nbar);
がずらずら並んで美しくなかったのです。
ご指導よろしくお願い致します。
No.3
- 回答日時:
> サブルーチン化するなどの方法で、この2つのルーチンを短く記述することは、できないでしょうか?
こうでしょうね。
void func(FILE *fp)
{
fprintf(fp,"A");
...
fprintf(fp,"Z");
}
int main()
{
func(stdout);
func(fp);
return 0;
}
この回答への補足
ご連絡が遅くなって大変申し訳ありません。非常に良く分かりました。
早速行おうとしたところ、関数にすると引数で渡す変数の数が多くなるので、サブルーチンでない方が良いかと思いました。
そこで、ご教示頂いた方法を応用して、メインで、ファイルポインタを変更して、forループを2回行う方法が良いかと思いました。
1回目は、FILE* fp=stdoutで、2回目は、fp=fp2(ファイルオープンで開いたもの)
ただ、こうしたところ、fp=stdoutの代入がうまく行っていないようで、標準出力に出力されません。fpの代わりにstdoutを使うと問題なく行くのですが、何故でしょうか?
よろしくお願いします。
No.2
- 回答日時:
>サブルーチン化するなどの方法で、
>この2つのルーチンを短く記述することは、できないでしょうか?
途中で送信しました。。。;
ちなみにこっちは
#include <stdarg.h>
void print( FILE* fp, const char* fmt, ... )
{
va_list arg;
va_start( arg, fmt );
vprintf( fmt, arg );
vfprintf( fp, fmt, arg );
va_end( arg );
}
みたいなのとか適当につくってそれを呼び出せば良いかと。
ご教示ありがとうございました。
自分が未熟なので、プログラム例を理解するのに時間がかかってしまいました。上記の最初のvprintfの時に、stdoutで標準出力できるようにしてみました。おかげさまで、うまく出力できるようになりました。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fwprintf()について
-
ストリーム 意味について。
-
Acccess レポートをグループ別...
-
VC++でUTF-8のファイルを出力し...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
(VBA)書式が変更されてしまい...
-
BitBltについて。
-
テキストの各行に行番号をつけ...
-
Wordマクロで指定したフォルダ...
-
C言語での縦方向のファイル出力...
-
VC++での外部ファイル(batファ...
-
gccによって、BOM付きのUTF-8で...
-
ファイルの文字コードをUTF-8に...
-
できるだけ簡単なプログラムを...
-
C言語で・・・・。
-
VB.NETでExcelファイルを出力す...
-
fflush()、setbuf()について
-
Base64でエンコードした後の文...
-
C++/CLIにて、System.String^型...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Paiza Cloudです。 どうやれば...
-
Paiza Cloudです。学籍番号と氏...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
ファイル形式またはファイル拡...
-
fortranのtxtファイル出力書式...
-
CSV形式に変換
-
printfだと出力されるのにfprin...
-
C++ fprintf_sの使い方がわからん
-
c言語の質問です。 ランダムに4...
-
Wordマクロで指定したフォルダ...
-
C++/CLIにて、System.String^型...
-
pcap形式データをテキストへ抽出
-
二次元配列をクリップボードに...
-
raw形式からbmp形式への書き込...
おすすめ情報