C++ C++;:如何将数据输出到多个.dat文件?

C++ C++;:如何将数据输出到多个.dat文件?,c++,c,gnuplot,string-building,C++,C,Gnuplot,String Building,我正在做一个研究项目。我是C++初学者,编程一般。我已经做了一个程序,可以产生相互作用的粒子,这些粒子随着时间的推移在连续的空间中移动。我的程序只输出每个时间步中每个粒子的XY坐标 我想把我的发现形象化,想知道我的粒子是否在运动。我的教授说我必须使用gnuplot。由于我无法找到一种方法将数据输出到一个文件中,以便gnuplot能够识别它,因此我想到了以下策略: a) 对于每个时间步,生成一个XY坐标格式为“output_35;.dat”的文件 b) 在gnuplot中为它们中的每一个生成.pn

我正在做一个研究项目。我是C++初学者,编程一般。我已经做了一个程序,可以产生相互作用的粒子,这些粒子随着时间的推移在连续的空间中移动。我的程序只输出每个时间步中每个粒子的XY坐标

我想把我的发现形象化,想知道我的粒子是否在运动。我的教授说我必须使用
gnuplot
。由于我无法找到一种方法将数据输出到一个文件中,以便
gnuplot
能够识别它,因此我想到了以下策略:

a) 对于每个时间步,生成一个XY坐标格式为“
output_35;.dat
”的文件

b) 在
gnuplot
中为它们中的每一个生成
.png
文件

c) 使用所有
.png
文件制作移动粒子的电影

稍后我会担心b和c,但到目前为止,我能够使用以下代码在一个文件中输出所有数据:

    void main()
{
    int i = 0;
    int t = 0; // time
    int j = 0; 
    int ctr = 0;
    double sumX = 0;
    double sumY = 0;
    srand(time(NULL)); // give system time as seed to random generator


    Cell* particles[maxSize]; // create array of pointers of type Cell.

    for(i=0; i<maxSize; i++) 
    {
        particles[i] = new Cell(); // initialize in memory
        particles[i]->InitPos(); // give initial positions
    }

    FILE *newFile = fopen("output_00.dat","w"); // print initial positions
    for(i=0; i<maxSize; i++)
    {
        fprintf(newFile, "%f %3 ", particles[i]->getCurrX());
        fprintf(newFile, "%f %3 \n", particles[i]->getCurrY());
    }
    fclose(newFile);

    FILE *output = fopen("output_01.dat","w");
    for(t = 0; t < tMax; t++)
    {
        fprintf(output, "%d ", t);
        for(i=0; i<maxSize; i++) // for every cell
        {
            sumX = 0;
            sumY = 0;
            for(j=0; j<maxSize; j++) // for all surrounding cells
            {
                sumX += particles[i]->ForceX(particles[i], particles[j]);
                sumY += particles[i]->ForceY(particles[i], particles[j]);
            }
            particles[i]->setVelX(particles[i]->getPrevVelX() + (sumX)*dt); // update speed
            particles[i]->setVelY(particles[i]->getPrevVelY() + (sumY)*dt);
            particles[i]->setCurrX(particles[i]->getPrevX() + (particles[i]->getVelX())*dt); // update position
            particles[i]->setCurrY(particles[i]->getPrevY() + (particles[i]->getVelY())*dt);

            fprintf(output, " ");
            fprintf(output, "%f %3 ", particles[i]->getCurrX());
            fprintf(output, "%f %3 \n", particles[i]->getCurrY());
        }
    }
    fclose(output);
}
void main()
{
int i=0;
int t=0;//时间
int j=0;
int ctr=0;
双sumX=0;
双sumY=0;
srand(time(NULL));//将系统时间作为种子提供给随机生成器
Cell*particles[maxSize];//创建Cell类型的指针数组。
对于(i=0;iInitPos();//给出初始位置
}
FILE*newFile=fopen(“output_00.dat”,“w”);//打印初始位置
对于(i=0;igetCurrX());
fprintf(新文件,“%f%3\n”,粒子[i]->getCurrY());
}
fclose(新文件);
文件*output=fopen(“output_01.dat”,“w”);
对于(t=0;tsetVelX(粒子[i]->getprevelx()+(sumX)*dt);//更新速度
粒子[i]->setVelY(粒子[i]->getprevely()+(sumY)*dt);
粒子[i]->setCurrX(粒子[i]->getPrevX()+(粒子[i]->getVelX())*dt);//更新位置
粒子[i]->setCurrY(粒子[i]->getPrevY()+(粒子[i]->getVelY())*dt);
fprintf(输出“”);
fprintf(输出,“%f%3”,粒子[i]->getCurrX());
fprintf(输出,“%f%3\n”,粒子[i]->getCurrY());
}
}
fclose(输出);
}
这确实会生成两个文件,
output_00.dat
output01.dat
,第一个文件包含初始随机生成的位置,第二个文件包含我的所有结果

我可以感觉到,在嵌套的
for
循环中,我正在更新XY坐标的速度和位置,我可以有一个
文件*
,它将存储每个时间步的坐标,然后在增加时间之前关闭它。这样,我就不需要同时打开多个指针。至少这是我的int尤蒂安

我不知道如何生成递增的文件名。我偶然发现了流的
,但我不明白它是如何工作的

我想我希望我的程序在这一点上做的是:

1) 使用基本名称和当前循环计数器值生成新文件名

2) 打开那个文件

3) 写下该时间步长的坐标

4) 关闭文件

5) 重复一遍


任何帮助都将不胜感激。谢谢你抽出时间

> PFS使用FROW代替FPEN将更好地使用C++标准库,而现在您使用的是C标准库调用,但现在您所做的没有什么错误。 您真正的核心问题似乎是如何从整数生成文件名,以便在循环中使用它:

这里有一个方法:

// Include these somewhere
#include <string>
#include <sstream>

// Define this function
std::string make_output_filename(size_t index) {
   std::ostringstream ss;
   ss << "output_" << index << ".dat";
   return ss.str();
}

// Use that function with fopen in this way:
for (size_t output_file_number=0; /* rest of your for loop stuff */)  {
  FILE *file = fopen(make_output_filename(output_file_number).c_str(), "w");
  /* use the file */
  fclose(file);
}
//把这些放在某个地方
#包括
#包括
//定义此函数
字符串生成输出文件名(大小索引){
std::ostringstream ss;

ss所以你写了一个代码“产生相互作用的粒子,随着时间的推移在连续的空间中移动”,但仍然不知道如何使用循环??亲爱的aleguna,我知道如何使用循环(我猜),但我边学边自学。如果你能回顾一下你开始编程的时候,你可能会理解我的困境,因为我这样做没有任何帮助。当然,无数其他人也这样做了,但提问是唯一的学习方式。wjl很友好,在他的回答中提供了代码,但即使他有指给我看c_str()为了创造一个新的方法,我会很高兴。谢谢理解。1,因为这不是最好的问题,它是一个有效的问题,不值得得到这么多的下行。谢谢你这么快回答。我正在读绝对C++的Savitch,搜索互联网,我走,但我的进展缓慢。我不KNO。w我做错了什么,两次被否决。你回答的问题是我觉得我自己找不到的。再次感谢你的时间和精力!@Dima1982为了避免将来被否决,我建议你尽量在前面把你的问题弄清楚,这样读者就不必通读菲古的整个帖子了例如,你的问题并不是关于你的算法或循环,而是花了一些精力去了解你真正的问题是什么(用整数构建字符串).我不介意这个案子,但一般来说,问得不好的问题会引起社区的愤怒。=)非常感谢你的支持。我真的很感激。我以后会记住这一点。