double rho[1001], rhonew[1001];
int main(void)
{
int tstep, tmax, n, nmax, r;
double t, dt, x, dx;
dt = 0.001;
tmax = 1000;
dx = 0.1;
nmax = 1000;
rho0=1.0;
r=1;
FILE *afinal;
afinal = fopen("afinal.txt","w");
FILE *amid;
amid = fopen("amid.txt","w");
for (n = 0; n <= nmax; n++)
{
rho[n] = 500;
}
for (n = 0; n <= nmax; n++)
{
rhonew[n] = 1;
}
for (tstep=1; tstep<=tmax; tstep++)
{
rho[tstep] += -tstep;
if(tstep == r*10)
//I want this if statement to execute every 10 "tsteps" to overwrite the data in amid.txt
{
for (n = 0; n <= nmax; n++)
{
x = n*dx;
fprintf(amid, "%f \t %f \n", x, rho[n]);
}
fclose(amid);
r++;
}
}
for (n = 0; n <= nmax; n++)
{
x = n*dx;
fprintf(afinal, "%f \t %f \n", x, rho[n]);
}
fclose(afinal);
return 0;
}
我的数组“在”中只写了一次,但是我希望它能够写入信息,然后在更大的“tmax”循环中用新信息多次覆盖旧信息。有了这个,我想通过gnuplot“随着时间的推移”绘制我的数据的快照,这样我就可以看到我的微分方程的工作进展了。
答案 0 :(得分:1)
for (tstep=1; tstep<=tmax; tstep++)
{
rho[tstep] += -tstep;
if(tstep == r)
{
rewind(amid);
for (n = 0; n <= nmax; n++)
{
x = n*dx;
fprintf(amid, "%f \t %f \n", x, rho[n]);
}
r += 10;
}
}
// later....
close(amid);
顺便说一句:为什么你使用rho[tstep] += -tstep;
而不是rho[tstep] -= tstep;
......这看起来有点难以阅读,至少我必须阅读两次,你正在做什么那里。
也许您的问题是,您过早关闭该文件..还要注意您对代码的误导性缩进。
此外,您应该在这里提出问题。你的问题实际上是什么?
答案 1 :(得分:1)
尝试:
if (tstep%10 == 0)
//I want this if statement to execute every 10 "tsteps" to
// overwrite the data in amid.txt
这是mod运算符。它将tstep除以10并返回余数。如果余数为零,则执行for循环。
另外,如果你的十步中需要一个“阶段”,那么tstep%10 == 2
或者1,3,一直到9,那么你仍然会每十步执行一次循环,只有相对于外循环。