关于 读取配置数据丢失的问题

辉歌 2003-10-16 05:24:08
关于 读取配置数据丢失的问题

现在有一个很奇怪的问题。如下:
我在程序里用了两个CArray,
CArray arrayData;//保存当前正在使用的配置数据,
CArray arrayBak; //记录用户在界面上更新的配置情况。

这两个数据都是在程序启动时,读取配置文件。分别读取两次,第一次读入到arrayData中,第二次读入到arrayBak中。

然后程序运行,当退出时,将arrayBak中的数据保存。


可是现在出现的情况是,有时候数据可以正常保存和读取,可是由于程序是24×7运行的,可能程序会出现错误死掉,然后看门狗会重启计算机。由于以前就出现了这个情况,所以我们用了一个土方法,每次计算机重启后,将备份的正确的配置文件拷贝一次。可是有时,该程序读取的数据竟然丢了数据,导致出现大量错误。

有大虾碰到过这样的情况吗?

代码如下:

void LoadSwData(void)
{

//added by Guocongsong
//LoadAdslAdjustValue(); 在LoadCfgData中调用


CString strFileName;
CFile file1,file2;
WORD wSwNumber = 0;
strFileName.LoadString(IDS_SWCFGFILENAME);
if(!file1.Open(strFileName,CFile::modeRead))
{
file1.Open(strFileName,CFile::modeCreate | CFile::modeWrite);
file1.Write(&wSwNumber,2);
file1.Close();
file1.Open(strFileName,CFile::modeRead);
}
CArchive ar0( &file1, CArchive::load,MAX_AR_BUFFER_SIZE);
ar0.Close();
CArchive ar1( &file1, CArchive::load,MAX_AR_BUFFER_SIZE);
ar1>>wSwNumber;
for(WORD w=0;w<wSwNumber;w++)
{
CSwitch* pSw = new CSwitch;
ar1 >> *pSw;
pSw->lTouchEleLine *= 1000;
pSw->lMixWithOthers *= 1000;
pSw->lEarth *= 1000;
pSw->lABLineBadInsulsion *= 1000;
pSw->lMixWithSelf *= 1000;
pSw->lMaxErrBetweenTwoVMeasure *= 1000;
pSw->lMaxErrBetweenTwoRMeasure *= 1000;

int j = pSw->phonePre.GetSize();

for(int i=0;i<j;i++)
{
Prefix* pre1 = new Prefix;
Prefix* pre2 = (Prefix*)pSw->phonePre[i];
memcpy(pre1->prefix,pre2->prefix,8);
pre1->prefix_len = pre2->prefix_len;
pre1->phone_len = pre2->phone_len;
pre1->swNo = pre2->swNo;
pre1->testDevType = pre2->testDevType;
pre1->devNo = pre2->devNo;
pre1->file = NULL;
arrayPrefix.Add(pre1);
}

//added by Guocongsong
CAdslAdjust *pAdjust;
pAdjust = AdslAdjust(pSw->no);
if (pAdjust != NULL)
{
//pSw->m_lLength = pAdjust->m_lLength;
//pSw->m_lAttention = pAdjust->m_lAttention;
//pSw->m_lMLen = pAdjust->m_lMLen;

pSw->lAdslCag = pAdjust->lAdslCag;
pSw->lAdslCbg = pAdjust->lAdslCbg;
pSw->lAdslCab = pAdjust->lAdslCab;

pSw->lAdslLossAt300k = pAdjust->lAdslLossAt300k;
pSw->lAdslLossAt1104k = pAdjust->lAdslLossAt1104k;
pSw->lAdslUpStream = pAdjust->lAdslUpStream;
pSw->fAdslDownStreamA = pAdjust->fAdslDownStreamA;
pSw->lAdslDownStreamB = pAdjust->lAdslDownStreamB;


pSw->lAdslLength = pAdjust->lAdslLength;
pSw->lAdslLB = pAdjust->lAdslLB;

}
arraySwitch.Add(pSw);

if(pSw->cReserved[0]!=0)
arrayONetSwitch.Add(pSw); ///zws!!

}
ar1.Close();
file1.Close();

file2.Open(strFileName,CFile::modeRead);
CArchive ar2( &file2, CArchive::load,MAX_AR_BUFFER_SIZE);
ar2>>wSwNumber;
for(w=0;w<wSwNumber;w++)
{
CSwitch* pSw = new CSwitch;
ar2 >> *pSw;
//added by Guocongsong
CAdslAdjust *pAdjust;
pAdjust = AdslAdjust(pSw->no);
if (pAdjust != NULL)
{
//pSw->m_lLength = pAdjust->m_lLength;
//pSw->m_lAttention = pAdjust->m_lAttention;
//pSw->m_lMLen = pAdjust->m_lMLen;

pSw->lAdslCag = pAdjust->lAdslCag;
pSw->lAdslCbg = pAdjust->lAdslCbg;
pSw->lAdslCab = pAdjust->lAdslCab;

pSw->lAdslLossAt300k = pAdjust->lAdslLossAt300k;
pSw->lAdslLossAt1104k = pAdjust->lAdslLossAt1104k;
pSw->lAdslUpStream = pAdjust->lAdslUpStream;
pSw->fAdslDownStreamA = pAdjust->fAdslDownStreamA;
pSw->lAdslDownStreamB = pAdjust->lAdslDownStreamB;


pSw->lAdslLength = pAdjust->lAdslLength;
pSw->lAdslLB = pAdjust->lAdslLB;

}
arraySwitchBak.Add(pSw);

}
ar2.Close();
file2.Close();

}
...全文
61 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
辉歌 2003-10-16
  • 打赏
  • 举报
回复
出现这种情况的几率很小,但出现一次影响很大。
并且像这样的代码在程序中有很多处,但就是只有该配置丢失。
可以保证的是,每次读取文件时,文件都是正常完整的。但有时第一次读取后,数据丢失,但立即关闭程序,再启动一次,数据又正常。
yintongshun 2003-10-16
  • 打赏
  • 举报
回复
是系统的内存读取写时把文件晴空了吧,建议把系统搞一下,呵呵
辉歌 2003-10-16
  • 打赏
  • 举报
回复
补充:
当发现数据丢失后,关闭程序,然后再启动一次,数据又正常读取。真是百思不得其解。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧