string类中存放的不是字符串的值,而是字符串空间的首地址,你StoreRecode函数向文件中存的实际上是地址,而不是字符串的实际值。
要不以固定大小的字符数组试试。
我对string类的细节不太清楚,说错了谅解。
stu=(StudentRecord *)node->GetData(); //stu为指向学生数据派生类的指针
outfile.write((char *)stu,sizeof(StudentRecord)); //将数据存入文件
没看到GetData函数是怎么样,不过sizeof(StudentRecord) 大小的内容写入文件,几乎肯定会出错。 对象的大小包括函数地址等,很难确定。
没见过保存数据这么保存的!!一个对象内存映像全部copy到硬盘上!!!
虽然一向很讨厌谈编程风格如何,但是您的程序实在太糟糕了!
首先提点建议:
1.除了主函数,主线程,其他所有函数和线程最好都不要在调用或运行时候产生输出,应该由主函数根据他们的返回值或消息来做出反应。但你的函数中到处可见cout。
2.函数的返回值最好不要为void,应该使他们“有点责任”,向调用者报告执行结果,如果一个返回值无法区分所有的错误类型,那就在函数返回错误前给出一个错误码放在类的静态成员中。
3.对于前人已经做过的工作就不要重复了。您的程序中重新定义了链表类,我觉得您使用类模板会省事些。
我大致看了您的程序,在StoreFile(List & Student)中定义了一个流对象,并以二进制方式打开,但接下去您试图将StudentRecord对象stu强制转换为char*型并存储到该流中,且不说StudentRecord不加控制地转换成为char*后是什么模样,就算最理想的情况真的存进去了,您的LoadFile(List & Student)函数看起来并没有智能化到能从二进制流中读出一个char*并把它按您的潜意思分成三个string分别作为StudentRecord的三个成员……
如果要达到目的,就得一句一句代码自己写,一个StudentRecord怎么存入文件,之后如何读出,这应该先由您自己考虑清楚,至少应该把StudentRecord的三个数据成员分几次依次放入读取时也应该依次读出,这都是严格的。而您的程序给人的感觉是不负责任,或者用过于“浪漫主义”来形容比较恰当。
存入文件和从文件读出来的size有问题。
在每个记录最后加一个表示,然后根据这个表示确定一个人。
或者象楼上说的,使用固定的大小。