14 ファイル入出力 ofstream(), ifstream()

マニュアルの §4.11 に詳しい説明があるが、 非常に簡単である (嬉しい)。

マニュアルの例では、 カッコ { } でくくってブロックを作って、 その中で変数を宣言している。 ブロックを抜けるときにファイルがクローズされるということである (出力の場合は、書き出しが完了するわけだ)。 なるほどとは思うけれど、気付かない人が多いんじゃないかな。 まあ、プログラムが終了時にクローズされるんだろうけど。

実例を2つあげる。 まず、 「おまけ: gnuplot で可視化」 に載せた例。

プログラム例: BiharmonicEigenvalues4.edp

// BiharmonicEigenvalues4.edp
// 2012/8/2

load "Morley"
verbosity=1;
int i,NN;

cout << "input N: ";
cin >> NN;
cout << "N=" << NN << endl;

real sigma=0.3;
mesh Th=square(NN,NN);
fespace Vh(Th, P2Morley);
Vh [u,ux,uy], [v,vx,vy];

macro lap2(u,v) ((dxx(u)+dyy(u))*(dxx(v)+dyy(v))) // EOM
varf aa([u,ux,uy], [v,vx,vy]) = int2d(Th)
  (lap2(u,v)-(1-sigma)*(dxx(u)*dyy(v)+dyy(u)*dxx(v)-2.0*dxy(u)*dxy(v)));

varf bb([u,ux,uy], [v,vx,vy]) = int2d(Th)(u*v); 

matrix A=aa(Vh,Vh,solver=UMFPACK); 
matrix B=bb(Vh,Vh,solver=UMFPACK); 

int nev=40;
real[int] ev(nev); // Stockage des valeurs propres
Vh[int] [eVu,eVux,eVuy](nev);  // Stockage des vecteurs propres

int k=EigenValue(A,B,sym=true,value=ev,vector=eVu,tol=1e-10,maxit=0,ncv=0);

{
  ofstream f("BiharmonicEigenvalues-" + NN + ".txt");
  f.precision(15);
  for (i = 0; i < nev; i++) {
    f << ev[i] << endl;
  }
}

for (i=0;i<nev;i++) {
  cout << ev[i] << endl;
  //  plot(eVu[i],[eVux[i],eVuy[i]],nbiso=64,fill=true,wait=true);
  plot(eVu[i],nbiso=64,fill=true,wait=true);
}

この例では f.precision(15); で表示桁数を指定している。

cout のときと同じように、 f.scientific;, f.fixed;, f.showbase;, f.noshowbase;, f.showpos;, f.noshowpos;, f.default; などが使える (C++ を知っていれば意味は想像出来るであろう)。



Subsections

桂田 祐史