试图写入文件,但只打印一次

Trying to write to file but only prints once

本文关键字:打印 一次 文件      更新时间:2023-10-16

我正在写一个小物理引擎,我正在学习如何写入文件,我想做的就是以相同的方式打印与 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();,但这行不通。

流通常被缓冲。结果之一是,写入流到流的字符直到缓冲区被冲洗。

才出现在目的地中。

如果您不采取任何措施冲洗缓冲区,那么在填充缓冲区之前,书面字符才会出现,考虑到您写入文件的速率,这将花费很长时间。

您需要执行以下操作之一:

// 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();

始终尝试在隔离中开发新功能。尝试以下操作:

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();
}

如果失败,我们可以尝试解决这个更简单的问题。如果成功,您可以将一些复杂性重新放在...