我正在编写一个小型物理引擎,我正在学习如何写入文件,我想要做的是将文件打印到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();
,但这不起作用。
答案 0 :(得分:1)
Streams通常是缓冲的。这样做的一个结果是,在缓冲区刷新之前,写入流的字符不会出现在目标中。
如果你没有做任何事情来刷新缓冲区,那么在填充缓冲区之前不会出现写入的字符,考虑到你写入文件的速率,这将花费相当长的时间。
您需要执行以下操作之一:
// 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();
答案 1 :(得分: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();
}
如果失败,我们可以尝试解决这个更简单的问题。如果成功,你可以把一些复杂性重新放回......