2011-05-11 70 views
0

在我的程序中,我的数据输出:void outfile不写入文件,任何人都可以找出原因吗?问题与流数据输出

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'标志的状态了吗? – 2011-05-11 09:42:28

回答

1

是否openoutfile成功。您已在main中打开输出文件;有些系统不允许打开两次相同的文件,或者打开两次输出。 (因为你没有使用main中的打开文件,为什么在那里打开它?)

+0

+1极有可能的原因;答案应该包括背后的检查,以检查错误状态为好习惯。 – 2011-05-11 09:55:17

+0

我把它从主体中取出,发生了同样的事情,所以我将outfile注释掉了,然后tableout工作正常,所以很可能是因为我打开了两次。如果我只能打开一次,我将如何继续加载循环中的数据? – Brian 2011-05-11 10:01:31

+0

@Brian加载数据不是问题,是吗?但更一般地说,您将在比实际IO更高级的函数中打开文件,并将'istream&'或'ostream&'传递给执行IO的函数。正如@Tomalak所说:总是检查公开结果。 – 2011-05-11 11:25:17