Jin the Conqueror 2015-06-02 10:37 采纳率: 100%
浏览 3294
已采纳

MFC中读写文件问题 CArchive写入文件的是乱码

代码如下,写入文件之后再打开txt发现除了前面的学号,后面的都是乱码。各行写有注释,请各位帮忙看一下,我觉得可能是宽字节的问题,但是本人是小白不知道该怎么弄,谢谢各位。

void Add::OnClickedIdbAdd()
{
    // TODO: Add your control notification handler code here
    UpdateData();
    if (!m_aComp || !m_aEng || !m_aMath || !m_aGym || m_aName=="" || m_aSno=="" || m_aMajor=="" ){
        MessageBox(_T("请完善信息后再确认输入!"), _T("错误"));
        return;
    }                                                                //判断是否有空没有输入信息

    if (m_aSno.GetLength() != 6){
        MessageBox(_T("学号必须为6位数,请重新输入。"), _T("错误"));
        m_aSno = "";
        UpdateData(FALSE);
        return;
    }                                                               //学号必须要6位数

    CFile cf;
    if (!cf.Open(_T("D:\\SIMS.txt"), 
        CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite)){
#if def_DEBUG
        afxDump << "unable to open file" << "\n";
        exit(1);
#endif 
    }                                                               //判断是否打开文件成功
    CArchive cas(&cf, CArchive::store);
    CArchive cal(&cf, CArchive::load);          //两个CArchive,一个读一个写

    CString strSno;
    CString strtemp;

    cf.SeekToBegin();

    while (cf.GetPosition() != cf.GetLength()){
        cal >> strSno;
        MessageBox(strSno);
        if (m_aSno == strSno){
            MessageBox(_T("该学号已存在,请重新输入。"), _T("错误"));
            m_aSno = "";
            UpdateData(FALSE);
            return;
        }                                                               //如果有重复就不写入
        cal.ReadString(strtemp);                       //读完这一行剩下的数据以便进入下一行
    }                                                                //不断执行直到文件尾


    cf.SeekToEnd();                                    //符合条件了则开始写入,首先移动到末尾
    cas << m_aSno  << m_aName  << m_aMajor  << m_aComp << m_aMath << m_aEng << m_aGym << "\n";        //利用CArchive写入
    m_aSno = "";
    m_aName = "";
    m_aMajor = "";
    m_aComp = 0;
    m_aEng = 0;
    m_aGym = 0;
    m_aMath = 0;
    UpdateData(FALSE);                                  //写完后自动清空对话框中内容

    MessageBox(_T("添加成功"), _T("成功"));

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


}

写入到文件之后,打开txt结果是这样的。
图片说明

不知道这是什么原因?我的vs2013默认的就是unicode。
另外我想知道如果向我上面那样用CArchive往文件里写数据,怎样才能写入一个换行符呢?还有就是CArchive有没有什么办法能够做到像ostream的<<一样能够使用setw来调整格式呢?小弟刚学,问题有点多,谢谢各位~

  • 写回答

3条回答 默认 最新

  • oyljerry 2015-06-02 14:13
    关注

    用二进制方式写入文件,同时读取的时候也用二进制读取。

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

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)