Jin the Conqueror 2015-06-05 08:36 采纳率: 100%
浏览 2385
已采纳

CArchive如何才能替换txt文件中的某一行?

我用CArchive进行文件的读写,现在想修改其中的某一行,于是我声明了两个CArchive
对象,基于同一个CFile对象,一个读,一个写。先从文件中读入,然后读入的数据是否
满足条件,若满足,则紧接着用另一个CArchive对象写入新数据,若不满足,则把原来
的数据再写回去。但是好像有问题,两个CArchive对象声明的时候,如果是store的在
前面,则可以添加,但是会直接添加到文件结尾,如果声明时load的那个在前面,则添
加了文件没有变化。请问为什么会这样呢?是因为缓冲区吗?另外请问各位大神可以怎样
解决这个问题呢?谢谢各位~

 void Modify::OnClickedIdbModify()
{
    // TODO: Add your control notification handler code here
    if (!m_mComp || !m_mEng || !m_mMath || !m_mGym || m_mName == "" || m_mSno == "" || m_mMajor == ""){
        MessageBox(_T("请先进行搜索再尝试更改!"), _T("错误"));
        return;
    }

    MessageBox(_T("您正尝试更改一名学生的信息!\r\n确认更改请单击'确定',否则请单击'取消'"),
        _T("警告"), MB_ICONEXCLAMATION | MB_OKCANCEL);

    UpdateData();

    CFile cf;
    if (!cf.Open(_T("D:\\SIMS.txt"),
        CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeBinary)){
#if def_DEBUG
        afxDump << "unable to open file" << "\n";
        exit(1);
#endif 
    }

    CArchive cas(&cf, CArchive::store);
    CArchive cal(&cf, CArchive::load);            //能否成功写入似乎与声明的顺序有关

    CString temp;
    CString sno;

    int flag = 1;
    while (flag){
        cal >> sno;
        cal.ReadString(temp);                    //先把这一行分两部分读入
        if (m_mSno == sno){                     //再判断读入的sno是否满足条件
            UpdateData();
            cas << sno << m_mName << m_mMajor << m_mComp << m_mMath << m_mEng << m_mGym;  
            temp.Format(_T("\r\n"));
            cas << temp;
            flag = 0;                //若满足,则把对话框中新获得的数据在这一行覆盖原数据
        }
        else{                        //若不满足,则把刚刚读入的原数据重新写回去
            cas << sno;
            cas.WriteString(temp);
        }

    }                                 //继续下一行的读入与判断

    cas.Close();
    cal.Close();
    cf.Close();
}

各位大神帮帮忙,小弟初学MFC,想做一个修改文件中某行数据的功能。谢谢!

  • 写回答

4条回答 默认 最新

  • threenewbee 2015-06-05 08:38
    关注

    文本文件替换一行没有什么高效的办法,因为不是二进制文件。如果文件大小不是很大(100万行以内),建议一次性读取到内存,然后再输出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。