2016-11-28 57 views
0

我正在寫一個小物理引擎,我正在學習如何寫入一個文件,我想要做的是打印與angle.txt文件的角度相同的方式輸出。這是我的程序:試圖寫入文件,但只打印一次

int main() { 

ofstream myFile; 
myFile.open("angle.txt"); 


cout << "Insert a lanuch Angle (theta): "; 
cin >> thetaDegrees; 
cout << "Insert a launch height: "; 
cin >> yOld;   
cout << "Insert an initial velocity: "; 
cin >> initialVelocity; 
cout << "Time (DeltaT) in seconds: "; 
cin >> totalT; 

for (double deltaTime = 0.0; deltaTime < totalT; deltaTime += 0.1) { 

    const double squared = deltaTime * deltaTime;  // squared constant for deltaTime squared 

    theta = thetaDegrees * PI/180; // converts theta to a degrees value 

    // apply initialV to velocity 
    velocity = initialVelocity + 9.8 * time; 

    yNew = yOld + velocityY * deltaTime - gravitiyHalf * (squared); // calculates Y 

    velocityY = velocity - 9.8 * deltaTime; // includes gravity to Y 

    angle = atan2(yNew, xNew) * 180/PI; // convert angle to degrees 

    this_thread::sleep_for(chrono::seconds(1));  // sleeps for 1 second each loop 

    cout << "\nHeight: " << yNew << endl; 
    cout << "Angle: " << angle << endl; 
    myFile << angle; // it displays the first value but nothing else! 
    myFile.close(); 

    yOld = yNew;  
} 

} 

當我運行這個程序時,文件只顯示角度的第一個值,然後它忽略了其餘部分。我該如何解決這個問題,以便angle.txt文件顯示角度的每個值?

編輯:我也試過在for循環之外使用myFile.close();,但這是行不通的。

+1

當然,寫入角度後不要關閉文件。看看代碼在做什麼,清澈透明。 'myFile <<角度; myFile.close();第一個角度寫入文件,並關閉文件。結束。一臺電腦總是做你告訴它做的事情,而不是你想做它。 –

+0

我認爲,但是當我關閉循環外的文件時,它根本不顯示任何內容。 –

+0

將它們打印到cout時它顯示正確的值嗎? – Harper

回答

1

流通常會被緩衝。這樣做的一個結果是寫入流中的字符不會出現在目標中,直到緩衝區被清空刷新爲

如果你沒有做任何事情來刷新緩衝區,那麼寫入的字符將不會出現,直到緩衝區被填滿爲止,考慮到寫入文件的速率,這將花費相當長的時間。

你需要做以下之一:

// Option 1 
myFile << angle << flush; 

// Option 2 
myFile << angle; 
myFile.flush(); 

如果你實際上意味着每個輸出是一個單獨的行,你只是忘記寫出來的換行符,然後有另一種選擇,因爲這正是endl的用途:

// Option 1 
myFile << angle << endl; 

// Option 2 
myFile << angle << '\n' << flush; 

// Option 3 
myFile << angle << '\n'; 
myFile.flush(); 
+0

請注意,您可能沒有遇到過'cout',因爲即使您忘記指定它們,也會發生很多魔術來嘗試併發生沖刷。 – Hurkyl

+0

謝謝!並感謝有關沖洗緩衝區的信息,並不知道它是這樣工作的。 –

0

總是嘗試開發新功能隔離。試試這個:

int main() { 

    ofstream myFile; 
    myFile.open("angle.txt"); 

    for (double deltaTime = 0.0; deltaTime < 2.0; deltaTime += 0.1) { 

    cout << "time: " << deltaTime << endl; 
    myFile << deltaTime << endl; 
    } 
    myFile.close(); 
} 

如果失敗了,我們可以嘗試解決這個更簡單的問題。如果成功,您可以將一些複雜性放回...