• 締切済み

ファイルポインタを使って計算結果をテキストファイルに出力したいのですが…

c++初心者です。電気回路のRLC直列回路の周波数を変え、インピーダンスの実数部、虚数部、絶対値、位相の計算をするプログラムを組んでその結果をファイルポインタを使ってテキストファイルに出力したいのですが、ファイルポインタについていまいち理解できていないため、上手くできません。一応、下のプログラムで計算はできるのですが、テキストファイルに出力する段階でエラーのようなものが表示され、止まってしまいます。プログラムの問題点やファイルポインタについて、どなたか分かりやすく教えて頂けないでしょうか。 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream.h> #include <complex.h> #define Complex complex <double> #define PI 3.141592653 using namespace std; Complex mul(double f); int main() { FILE *fa; double f,a,g,fd,w; double E=10.0; /* 起電力10V */ double R=5.0, L=5.0e-3 ,C=0.50e-3; /* 抵抗5Ω コイル5mH  コンデンサ0.5mF */ Complex z,s,u; fa=fopen("out.txt", "w"); if(fa=NULL){ printf("***error***\n"); exit(1); } printf(" 周波数 実部 虚部 絶対値 位相角\n"); fd=sqrt(1.01); for(f=1.0; f<=1.0e5; f*=fd) { z=mul(f); u=E/z; a=abs(u); g=atan2(imag(u), real(u)); printf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); } fprintf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); fclose(fa); } Complex mul(double f) { double w; double R=5.0,L=5.0e-3,C=0.50e-3; Complex z,s; w=2*PI*f; s=Complex(0.0,1.0)*w; z=R+s*L+1.0/(s*C); return z; }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★jactaへ ・ご指摘有り難うございます。  逆でしたね。→scanf() 系で %lf が double 型なので printf() 系も %lf というのが  間違いでしたね。すっかり思い違いをしていました。  有り難うございました。 ★質問者さんへ ・回答 No.4 の一部に間違いがありました。  回答者 No.5 さんのアドバイスが正しいです。  私の思い違いでした。 ・申し訳ありませんでした。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

反則御免で指摘します。 #4の回答にある > それと double 型の fprintf() 指定は『%f』ではなく『%lf』になります。注意! > 今は『%f』でも『%lf』と同様な表示を出力できるみたいですね。→C99 規格の話 fprintfの書式指定は、実引数がdouble型の場合でも%fです。なぜなら、可変個引数にfloat型の値を渡しても、既定の実引数拡張によって暗黙的にdouble型に変換されるからです。 C99では%lfも使えるようになりましたが、それはあまりにも間違える人が多いので、やむなく許容する仕様になっただけです。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★C++ ではなく C 言語でいきます。 ・ファイルのオープン、読み書き、クローズについて説明します。  下のサンプルをどうぞ。 サンプル: FILE *fp; if ( (fp = fopen("ファイル名","w")) == NULL ){  printf( "ファイルがオープンできません。\n" );  exit( 1 ); } fputc( 'A', fp ); ←1文字を出力 fputs( "あいうえお", fp ); ←文字列を出力 fprintf( fp, "%10.4lf\n", a ); ←書式制御付きの文字列を出力 fclose( fp ); その他: ・printf( "文字列" )  fprintf( fp, "文字列" )  となります。  fprintf() には fp を最初の引数に指定します。その後の引数は printf 関数と同じです。 ・よって、ファイルには  fprintf( fp, " 周波数 実部 虚部 絶対値 位相角\n" );  fprintf( fp, "%10.4lf %8.4lf %8.4lf %8.4lf %8.4lf\n", f, real(u), imag(u), a, g );  となります。 ・あとファイルポインタは習慣的に fp という名前を私は良く使います。→もちろん自由な名前で構わないが…。  それと double 型の fprintf() 指定は『%f』ではなく『%lf』になります。注意!  今は『%f』でも『%lf』と同様な表示を出力できるみたいですね。→C99 規格の話 最後に: ・無理に C++ で記述しないで最初は C 言語で記述してみたらどうでしょうか。  C++ でも C 関数は利用できるようですが、標準入出力は cin、cout、cerr などを C++ では使います。  混同しているのでどちらかに統一しましょう。→最初は C 言語かな。 ・以上。おわり。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

> エラーのようなものが表示され、止まってしまいます。 エラーのようなものが表示されたなら、ちゃんと書いてください。 とりあえず、明らかにおかしい点は > if(fa=NULL){ faにNULLを代入してしまっている。 > fprintf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); fprintfの第1引数がファイルポインタになっていない。 # C++なら.hなしのcmathやiostreamをincludeしたほうがらしくないか。

noname#50176
noname#50176
回答No.2

printf(" 周波数 実部 虚部 絶対値 位相角\n"); fd=sqrt(1.01); for(f=1.0; f<=1.0e5; f*=fd) { z=mul(f); u=E/z; a=abs(u); g=atan2(imag(u), real(u)); printf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); fprintf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); }・・・※移動した点 fclose(fa); } くくりの位置がずれていたのでは・・・? 元のですとループからぬけた時にカウンタfが1カウンタ超過する ので最大値越えの配列インデックスを参照しエラーと なるんじゃないでしょうか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

C++ なら素直に ofstream を使えばいいような気もしますが、 >fprintf("%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); 第一引数にファイルポインタが指定できていないだけでは? fprintf(fa, "%10.4f %8.4f %8.4f %8.4f %8.4f\n",f,real(u),imag(u),a,g); に修正するとどう?

関連するQ&A