2011-05-11 72 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