2 sinat 16233621 sinat_16233621 于 2015.05.31 22:29 提问

小弟初学MFC,在文件读写方面遇到了问题

小弟初学MFC,在弄一个简单的学生管理系统,添加了一个对话框用于添加学生信息,然后在Add按钮添加了消息响应函数,对输入的数据进行写入到文件之中,但
是在判断是否读完的时候总是会出现问题,请教各位,代码如下:

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("请完善信息后再确认输入!"));
return;
}

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

int strlen = m_aSno.GetLength();
char* strSno = "";
CString strtemp;

csf.SeekToBegin();

while (csf.Read(strSno, strlen)){             //每次运行到这里出问题
    if (m_aSno == strSno){
        MessageBox(_T("该学号已存在,请重新输入。"));
        m_aSno = "";
        UpdateData(FALSE);
        return;
    }
    csf.ReadString(strtemp);
}

csf.SeekToEnd();
strtemp.Format(_T("%s   %s   %s   %d   %d   %d   %d\n"), 
    m_aSno, m_aName, m_aMajor, m_aMath, m_aComp, m_aEng, m_aGym);
csf.WriteString(strtemp);

csf.Close();

}
出现的问题如下:

图片说明

不知道这个怎么办?本人小白,很多都不懂,请大家多多指教。谢谢!

8个回答

oyljerry
oyljerry   Ds   Rxr 2015.05.31 22:31

你的strSno没分配空间,只是一个指针,程序访问出错了。你需要new来分配。

sinat_16233621
sinat_16233621 我用的是m_aSno == strSno,去百度了下发现有人说CString和char*可以这样直接比较,但是我这样写了,文件里面明明有重复的部分,但是却仍然显示不相同啊。。
2 年多之前 回复
sinat_16233621
sinat_16233621 谢谢!没注意是这里错了。。不过我还想请问一下,想我上面那样,m_aSno是从对话框中获得的CString,我把文件中的数据不断地读入char*类型的strSno,我想比较这两个内容是否相同,怎么比较呢?不好意思我刚刚学。。很多不懂,多谢指点!
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.05.31 22:49

char* strSno = "";
->
char strSno[100];

sinat_16233621
sinat_16233621 谢谢!这个问题解决了~
2 年多之前 回复
91program
91program   Ds   Rxr 2015.05.31 22:49

想简单一些,且如果知道读数据的最大长度,可以将 strSno 定义为数组。

dazhuan0429
dazhuan0429 我也跟着学习学习
2 年多之前 回复
sinat_16233621
sinat_16233621 谢谢!别的地方问了半天没人鸟我,果然还是csdn比较靠谱啊
2 年多之前 回复
91program
91program 怎么与老曹的想法一样,晕!
2 年多之前 回复
visionarywind
visionarywind   2015.05.31 23:43

没有分配空间是正解,我补充一点: 都用到 CStdioFile了,为啥不用CString呢?

sinat_16233621
sinat_16233621 额。。请问你是说char* strSno = "";这一句么?好像csf.Read(strSno, strlen)这样读取文件的时候第一个参数不能使CString类型的啊。。。不知道你说的是这个意思吗?
2 年多之前 回复
lx624909677
lx624909677   Ds   Rxr 2015.06.01 12:06

CString不能喝char*那样比较,CString是一个类,里面有很多内容,char*只是一个指针

VisualEleven
VisualEleven   Ds   Rxr 2015.06.02 15:24

char* strSno = "";
没有分配空间~

neverpassaway
neverpassaway 我的vs2013是默认的unicode
2 年多之前 回复
neverpassaway
neverpassaway 恩恩是的。。这个问题我已经解决了。但是遇到了新问题。。我换成了用CArchive写入,但是打开txt发现都是乱码是什么情况。。。我的vs3
2 年多之前 回复
dazhuan0429
dazhuan0429   2015.06.03 08:58

也碰到过这个问题,跟着学习了。。。

feitianxiaozi
feitianxiaozi   2015.06.03 11:09

char* strSno = ""; //内存
CString strtemp;

csf.SeekToBegin();

while (csf.Read(strSno, strlen)){

Csdn user default icon
上传中...
上传图片
插入图片