C++ 二进制文件读写异常

秘游DCEL 2014-01-09 06:12:17
这个问题困扰了我整个下午了.....不知道哪里发生了错误!!






异常信息:
FoodSystem.exe 中的 0x5500ad4a (msvcp100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x005685c4 时发生访问冲突
FoodSystem.exe 中的 0x5500ad4a (msvcp100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x005685c4 时发生访问冲突

在此先感谢大家的帮忙....谢谢!!

...全文
390 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vipcxj 2014-01-10
  • 打赏
  • 举报
回复
引用 7 楼 sam372648886gz 的回复:
[quote=引用 6 楼 vipcxj 的回复:] 又是初学者爱犯的毛病,只有POD类型可以安全地写到文件再读回来。string不是POD类型,不能直接写进文件,具体原因是string是个复杂的类,内部可能有指针成员,指向new出来的堆对象,但因为它会在析构函数里自己delete,所以不会有内存泄漏,使用时也完全感觉不到它使用了堆,但一旦你序列化,也就是写到文件里,那个指针也被写到文件里的。如果你再搞一个string对象读取出来,那么同一时间,就会有两个string对象持有同一个指向相同堆内存地址的指针,然后他们肯定都会析构,于是那个指针必定被delete两次,必定发生异常。 既然LZ声称能为这个问题想一下午,并且我也指出了发生问题的原因,我相信LZ可能都用不着一晚上,就能自己解决了
谢谢我明白了~~用char数组可以成功读写!!但char数组要固定长度....难度没办法用string吗??[/quote] 那你大可以不改类的结构,而修改序列化(读写文件)的操作。写文件时直接写入string内部的字符串,当然要记得把字符串长度也写进去,一般的格式是固定长度的数据代表字符串长度,后面跟着此长度的字符串,这样不就支持不定长字符串的序列化了,当然读的操作也要做对应修改。
赵4老师 2014-01-10
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
赵4老师 2014-01-10
  • 打赏
  • 举报
回复
string是对象,不是一段内存,不能简单地将其内存保存到文件或从文件中读到内存。 搜“序列化与反序列化”
秘游DCEL 2014-01-10
  • 打赏
  • 举报
回复
引用 6 楼 vipcxj 的回复:
又是初学者爱犯的毛病,只有POD类型可以安全地写到文件再读回来。string不是POD类型,不能直接写进文件,具体原因是string是个复杂的类,内部可能有指针成员,指向new出来的堆对象,但因为它会在析构函数里自己delete,所以不会有内存泄漏,使用时也完全感觉不到它使用了堆,但一旦你序列化,也就是写到文件里,那个指针也被写到文件里的。如果你再搞一个string对象读取出来,那么同一时间,就会有两个string对象持有同一个指向相同堆内存地址的指针,然后他们肯定都会析构,于是那个指针必定被delete两次,必定发生异常。 既然LZ声称能为这个问题想一下午,并且我也指出了发生问题的原因,我相信LZ可能都用不着一晚上,就能自己解决了
谢谢我明白了~~用char数组可以成功读写!!但char数组要固定长度....难度没办法用string吗??
秘游DCEL 2014-01-10
  • 打赏
  • 举报
回复
谢谢大家的回复...真是受益匪浅!!
vipcxj 2014-01-09
  • 打赏
  • 举报
回复
又是初学者爱犯的毛病,只有POD类型可以安全地写到文件再读回来。string不是POD类型,不能直接写进文件,具体原因是string是个复杂的类,内部可能有指针成员,指向new出来的堆对象,但因为它会在析构函数里自己delete,所以不会有内存泄漏,使用时也完全感觉不到它使用了堆,但一旦你序列化,也就是写到文件里,那个指针也被写到文件里的。如果你再搞一个string对象读取出来,那么同一时间,就会有两个string对象持有同一个指向相同堆内存地址的指针,然后他们肯定都会析构,于是那个指针必定被delete两次,必定发生异常。 既然LZ声称能为这个问题想一下午,并且我也指出了发生问题的原因,我相信LZ可能都用不着一晚上,就能自己解决了
秘游DCEL 2014-01-09
  • 打赏
  • 举报
回复
没人吗??问题还没有解决啊!!!! 内容是成功读取出来了,但就是出方法的时候引发异常!!
秘游DCEL 2014-01-09
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:

//write
Item item;
int len = item.name.length();
fstream.write((char*)&len, sizeof(int));
fstream.write(item.name.c_str(), len);
fstream.write((char*)&item.price, sizeof(item.pricing));
读的过程与之对应.
[/quote] 谢谢~~但读取时还是引发异常...... 可以拜托一下,把读取的代码贴一下吗?因为刚刚学习C++不久实在不太懂~~~谢谢
mujiok2003 2014-01-09
  • 打赏
  • 举报
回复

//write
Item item;
int len = item.name.length();
fstream.write((char*)&len, sizeof(int));
fstream.write(item.name.c_str(), len);
fstream.write((char*)&item.price, sizeof(item.pricing));
读的过程与之对应. [/quote]
mujiok2003 2014-01-09
  • 打赏
  • 举报
回复
[code=c] //write Item item; int len = item.name.length(); fstream.write((char*)&len, sizeof(int)); fstream.write(item.name.c_str(), len); fstream.write((char*)&item.price, sizeof(item.pricing)); [/code 读的过程与之对应.
mujiok2003 2014-01-09
  • 打赏
  • 举报
回复
Item含了string子对象,其结构比较复杂. 所以不能直接当成buffer读写.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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