读书人

将向量用作写入文件的缓存为什么导致

发布时间: 2012-02-25 10:01:49 作者: rapoo

将向量用作写入文件的缓存,为什么导致数据丢失?
在一个类当中,设定了一个缓存this->FileBuffer,用这个缓存存储循环当中产生的相应数据,然后在循环结束之后,通过函数SaveStatistic(void)打开一个文件,把缓存当中的内容存入文件。问题是:每次程序运行完成之后,都只有最后一次循环得到的数据存入了文件,前面若干次的数据不翼而飞了。

this->FileBuffer缓存是c++的向量,
vector<double> FileBuffer;
基类声明:
class CRand
{

private:
intm_jrand;
int m_high;
int m_low;
double m_prob;
double m_lo;
double m_hi;
double m_mu;
double m_sigma;
double*pRandomList;
struct __timeb64m_time;
struct __timeb64m_oldtime;
protected:
stringm_IdObj;
double*pLowBound;
double*pUpperBound;

protected:
staticintm_PopSize;staticintm_maxruns;
struct __timeb64endtime;
struct __timeb64 statime;

vector<double> FileBuffer;
doublem_timcost;
intm_NumElem;
intm_maxgen;
intm_run;
intm_gen;
protected:
intflip(double m_prob);
voidrandomize();
doublerndreal(double m_lo,double m_hi);
doublenoise(double mu ,double sigma);
doublerandomperc();
unsignedrnd(unsigned m_low,unsigned m_high);

protected:
voidInitialization();
doublefnObj(double p[]);
public:
CRand();
~CRand();
virtual voidSetParam(void);
virtual boolSaveStatistic(void);
virtual voidRunOptimizer(void);
virtual voidInitPop(void);
virtual voidUpdateStatistic(void);
voidDoneOptimize(void);
};
pso类是公有继承rand类, class CPso :public CRand
派生类声明
class CPso :
public CRand
{
private:

doublem_Vmax;
doubleparamater_w; //历史系数, 由程序随机生成
doubleparamater_c1; //认知系数,一般取2.0
doubleparamater_c2; //社会系数, 一般取2.0
doubleparamate_cy;

doublegbest_pos_global[GANVARS];
doublegbest;
doublegbest_pos[GANVARS];
particle *p_PsoPop;
public:

CPso(void);
~CPso(void);

public:

voidInitPop(); //初始化种群
voidSetParam(void);
boolSaveStatistic(void);
voidRunOptimizer(void);
voidUpdateStatistic(void);
voidUpdatePosition(particle &p);
voidUpdatePBest(particle &p);
};

相应函数实现代码。第一部分代码是整个循环将数据写入缓存的过程,第二部分代码是存储文件的函数。

void CRand::DoneOptimize(void)
{
this->SetParam();
for(this->m_run=1;this->m_run<=this->m_maxruns;++this->m_run);
{
_ftime64_s(&this->statime);

this->RunOptimizer();

_ftime64_s(&endtime);
unsigned short temp=0;
if(this->endtime.time!=this->statime.time)
temp=1000+this->endtime.millitm-this->statime.millitm;
else
temp=this->endtime.millitm-this->statime.millitm;
this->m_timcost=temp/1000.00;
this->FileBuffer.push_back(this->m_run);
this->FileBuffer.push_back(this->m_timcost);
this->FileBuffer.push_back(this->m_NumElem);
this->FileBuffer.push_back(123.456);
}
this->SaveStatistic();
}
void CPso::RunOptimizer(void)
{
this->InitPop(); //代数范围是:[0, m_maxgen-1],总共m_maxgen代。
while(this->m_gen<=this->m_maxgen)
{
//每个粒子进行运动,求值,更行pbest
for(int k=0;k<this->m_PopSize;k++)
{
UpdatePosition(p_PsoPop[k]);
p_PsoPop[k].fitness=fnObj(p_PsoPop[k].varible);
UpdatePBest(p_PsoPop[k]);
}


//更新gbest.注意包含更新用于通信的全局变量
this->m_gen++;
this->UpdateStatistic();
}
}

void CPso::UpdateStatistic()
{
for(int i=0;i<m_PopSize;i++)
{
if(p_PsoPop[i].fitness>gbest)
{
gbest=p_PsoPop[i].fitness;
for(int j=0;j<GANVARS;j++)
{
gbest_pos[j]=p_PsoPop[i].varible[j];//也要更新全局的 gbest_pos_global,用于全体粒子通讯用。
gbest_pos_global[j]=p_PsoPop[i].varible[j];
}

}
}
//统计信息存入Buffer
this->FileBuffer.push_back(this->gbest);
this->m_NumElem=1;

}
文件存储:
bool CPso::SaveStatistic(void)
{
if(false==FileBuffer.empty())
{
std::ofstream tfile("log.txt",std::ios::app);
tfile<<"PSO"<<endl;
vector<double>::iterator iter;
for(iter=FileBuffer.begin();iter!=FileBuffer.end();++iter)
{
tfile<<*iter<<endl;
//tfile.write(reinterpret_cast<char*>(&this->m_bestfit),sizeof this->m_bestfit);
}
tfile.close();
this->FileBuffer.clear();
return true;
}else
return false;
}



[解决办法]
1.楼主应该学会如何贴代码请点击编辑框上方的“插入源代码” code=C/C++] 代码在这里 [/code
2.楼主应该学会省略的贴代码,无关问题的地方请用省略号代替。
这样回答你问题的人才会多。
[解决办法]
这么快就发上来了,帮顶!
[解决办法]
额。。。好久没弄C++了,一时有些眼花。
给楼主些建议。
1.另外开一个工程,抛开类的影响,将输入到缓冲和写入文件的函数单独扣出来进行测试,如果发现问题,就使用单步调试。
2.如果没问题,就将两部分函数组合起来继续测试。
3.如果还没问题,那么就将注意力转移的类上面,可能是你继承并重载函数的时候有影响。可以考虑将一些复杂函数的内部全屏蔽起来,用一些简单的代码(比如打印个什么)来测试。

读书人网 >C++

热点推荐