2011-05-11 1 views
0

私のプログラムでは、私のデータ出力:void outfileはファイルに書き込んでいません。ofstreamのデータ出力で

using namespace std; 
#include<iostream> 
#include<cmath> 
#include<iomanip> 
#include<fstream> 

// Declaration of functions used 
void writetable (double, double, double, double); 
void tableout (double, double, double, double); 
void secant(double, double, double, double, double, double, double, double, double, double&, int&); 
void writedata (double, double, double); 
void outfile(double, double, double&); 
double fx(double, double, double, double, double, double, double); 

const double tol=0.0001; // Tolerance for convergence 
const int max_iter=50;  // Maximum iterations allowed 
// main program 
int main() 
{ 
    int iteration;   // Number of iterations 

    double kr, uc, q, b, radians; 

    double x0, x1;   // Starting values for x 
    double root;   // Root found by secant method 
    const double PI = 4.0*atan(1.0); 
    ifstream datain ("shuttle.txt"); 
    ofstream dataout ("results.txt"); 
    datain >> kr >> uc >> q >> b; 
    x0= 1000; 
    x1 = 200; 
    writetable(kr, uc, q, b); 
    tableout(kr, uc, q, b); 
    for (double angle = 10; angle <= 70; angle += 15) 
    { 
     for (double velocity = 16000; velocity <= 17500; velocity += 500) 
     { 
      radians= angle * PI/180 ; 
      //cout << velocity << endl; 
      // cout << radians << endl; 
      // cout << angle << endl; 
      secant (radians, velocity, kr, uc, q, b, x0, x1, angle, root, iteration); 
      writedata(angle, velocity, root); 
     } 
    } 
    system("pause"); 
} 

// Definition of function "secant" 
// Receives a, b, c, d and x0 values from main program 
// Returns root and the iterations required 
void secant(double radians, double velocity, double kr, double uc, double q, double b, double x0, double x1, double angle, double& root, int& iteration) 
{ 
    double xnminus1, xnplus1, xn; // Local variables 
    iteration=0;     // Initialize iterations 
    xnminus1=x0; 
    xn=x1; 
    do 
    { 
     ++iteration; 
     xnplus1 = xn - fx(radians, velocity, kr, uc, q, b, xn)*(xn-xnminus1)/ 
            (fx(radians, velocity, kr, uc, q, b, xn)-fx(radians, velocity, kr, uc, q, b, xnminus1)); 
     //cout<<"x"<<iteration+1<<" = "<<xnplus1<<endl; 
     xnminus1 = xn; 
     xn=xnplus1; 
    } 
    while ((fabs(fx(radians, velocity, kr, uc, q, b, xnplus1)) >= tol)&& (iteration < max_iter)); 
    root=xnplus1; 

    //cout<<"\nThe root is = "<<root<<endl; 
    //cout<<"The number of iterations was = "<<iteration<<endl; 
    //cout<<"The value of f(x) at the root = "<<fx(radians, velocity, kr, uc, q, b, root)<<endl<<endl; 

    outfile(angle, velocity, root); 
} 

// Defines "fx" 
double fx(double radians,double velocity, double kr, double uc, double q, double b, double ts) 
{ 
    return kr * pow(ts,4.0) + uc * ts - q - pow((velocity/b), 2.0) * sin(radians); 
} 

void writetable(double kr, double uc, double q, double b) 
{ 
    cout <<endl << "Input Parameters:" <<endl; 
    cout<< "Kr(1/K^2)=" << kr << endl << "uc(1/K)=" << uc <<endl << "q(unitless)=" << q << endl << "b(mph)=" << b<< endl; 
    cout << " angle..............velocity...........surface temp..............safe.........."; 
    cout << " degs...............mph................Kelvin.....................?............"; 
    cout << "--------------------------------------------------------------------------------";  
} 

void writedata (double angle, double velocity, double root) 
{ 
    cout << left << " " << angle << "     "<< velocity << "     "<< fixed << setprecision(0) << setw(5) <<root<< "     "; 
    if(root <1000) 
     cout << "safe"<< endl; 
    else 
     cout << "unsafe" <<endl; 
} 

void tableout(double kr, double uc, double q, double b) 
{ 
    ofstream dataout ("results.txt"); 
    dataout<<endl << "Input Parameters:" <<endl; 
    dataout<< "Kr(1/K^2)=" << kr << endl << "uc(1/K)=" << uc <<endl << "q(unitless)=" << q << endl << "b(mph)=" << b<< endl; 
    dataout << " angle..............velocity...........surface temp..............safe.........."<< endl; 
    dataout << " degs...............mph................Kelvin.....................?............"<< endl; 
    dataout << "--------------------------------------------------------------------------------"<< endl; 
} 

void outfile (double angle, double velocity, double& root)      
{ 
    ofstream dataout ("results.txt"); 
    dataout << left << " " << angle << "     "<< velocity << "     "<< fixed << setprecision(0) << setw(5) <<root<< "     "; 
    if(root <1000) 
     dataout << "safe"<< endl; 
    else 
     dataout << "unsafe" <<endl; 
} 
+0

'ofstream'のフラグの状態を確認しましたか? –

答えて

1

outfileにはopenが続きます。あなたはmainに出力するためにファイルを開いています。一部のシステムでは、同じファイルを2回開いたり、2回開いて出力することはできません。 (mainで開いているファイルを使用しないので、なぜそこにオープンするのですか?)

+0

+1可能性が高い原因。しかし、回答には、エラー状態を良い習慣としてチェックするための裏側のプロダクトが含まれていなければなりません。 –

+0

私はそれをメインから取り出し、同じことが起こったので、私はoutfileをコメントアウトし、tableoutはうまくいったので、2度開いている可能性が高いです。私はそれを一度しか開くことができない場合、私はどのようにループからデータをロードし続けますか? – Brian

+0

@Brianデータを読み込むことは問題ではありませんか?しかしもっと一般的には、実際のIOを行うよりも上位の関数でファイルを開き、IOを実行する関数に 'istream&'や 'ostream&'を渡します。と@トマラクは言った:常にオープンの結果を確認してください。 –