C++文件读写 写入位置 0xFEEEFEEE 时发生访问冲突。

uchiha_iTachi 2013-05-07 12:26:13
新手求教啊 今天做文件读写测试的时候 出现这种问题 可以出现正常运行结果 但是运行结束后 就弹出对话框
0x5E90CCD2 (msvcp110d.dll) (testFile.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0xFEEEFEEE 时发生访问冲突。
#include <iostream>
#include <string>
using namespace std;

struct student
{
int x;
int y;
string path;
};
int main ()
{
//{{0,0,"1"},{0,0,"1"},{0,0,"1"}}
student stu[3] ;
student stu1[3];
for (int i = 0 ; i != 3 ; ++i)
{
stu[i].path = static_cast<string>("path");
stu[i].x = i;
stu[i].y = i+1;
}
FILE *in;// = fopen("test.data","w+b");
if(fopen_s(&in,"test.data","w")!=0)
cerr<<"open file err..."<<endl;
for (int i = 0 ; i != 3 ; ++i)
{
if (fwrite(&stu[i],sizeof(student),1,in)==0)
{
cerr<<"writing err..."<<endl;
}

}

//fseek(in,0,SEEK_SET);
fclose(in);
FILE *out ;//= fopen("test.data","r+b");
if (fopen_s(&out,"test.data","r")!=0)
{
cerr<< "open err"<< endl;
}
for (int i=0;i!=3;i++)
{
fread(&stu1[i],sizeof(student),1,out);
cout<< stu1[i].path<< stu1[i].x<<stu1[i].y<<endl;
}
fclose(out);
system("pause");
}
...全文
367 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nirvana_newbie 2013-05-07
  • 打赏
  • 举报
回复
fopen_s,fwrite是C语言的写法,看不懂。
nirvana_newbie 2013-05-07
  • 打赏
  • 举报
回复
后面两个for循环里的i不需要再int了。
uchiha_iTachi 2013-05-07
  • 打赏
  • 举报
回复
引用 1 楼 bluewanderer 的回复:
常见的默认数据 0xCD - Clear Data/ 0xBAADFOOD - Bad Food,刚申请的内存的默认内容 0xDD - Dead Data/0xFEEE - Free/0xDEADBEEF - Dead Beef,已经释放的内存的内容 0xFD - Fence Data,可用内存块之间的填充数据
首先还是感谢您能回复我,但是不太懂这些是什么意思 c++刚学,这些都不知道 希望您帮我看看到底代码什么错 谢谢了!
bluewanderer 2013-05-07
  • 打赏
  • 举报
回复
常见的默认数据 0xCD - Clear Data/ 0xBAADFOOD - Bad Food,刚申请的内存的默认内容 0xDD - Dead Data/0xFEEE - Free/0xDEADBEEF - Dead Beef,已经释放的内存的内容 0xFD - Fence Data,可用内存块之间的填充数据
uchiha_iTachi 2013-05-07
  • 打赏
  • 举报
回复
引用 8 楼 bluewanderer 的回复:
直接保存char *别的程序是读不出来的。 要么用char [],要么你需要更复杂的逻辑分别保存原始类型的数据和指针/对象数据。这个术语称为对象序列化。
太牛逼了 我又把char* 改成char[] 这次那个项目也没错了 真是太感谢了 真没想到这么简单的一句提示就解决了我的大问题 看来还是得好好体会体会这几个类型的区别了 总之 太谢谢了!!!
uchiha_iTachi 2013-05-07
  • 打赏
  • 举报
回复
引用 8 楼 bluewanderer 的回复:
直接保存char *别的程序是读不出来的。 要么用char [],要么你需要更复杂的逻辑分别保存原始类型的数据和指针/对象数据。这个术语称为对象序列化。
虽然还是不太懂,但还是谢谢你的提醒 的确 我那个测试程序是通过了 但是应用到另外一个项目中就还是会出这个帖子里面类似的问题 我再体会体会
bluewanderer 2013-05-07
  • 打赏
  • 举报
回复
直接保存char *别的程序是读不出来的。 要么用char [],要么你需要更复杂的逻辑分别保存原始类型的数据和指针/对象数据。这个术语称为对象序列化。
uchiha_iTachi 2013-05-07
  • 打赏
  • 举报
回复
引用 3 楼 nirvana_newbie 的回复:
后面两个for循环里的i不需要再int了。
虽然不是这个问题 但还是很感谢你能回复我 谢谢!
uchiha_iTachi 2013-05-07
  • 打赏
  • 举报
回复
引用 5 楼 bluewanderer 的回复:
呃... 没好好看你程序。以为是你直接用了已经释放的对象里的指针了... 不过事实上你还是用了已经施放的对象里的指针了,string(包括任何你不可能知道结构的对象——标准里没规定string的具体实现)是不能直接这样保存到文件的。VC里你这么干写入文件的是string里指向真正字符串内容的指针,相当于间接把这个本来不能复制的指针复制给了另一个string,到只两个string析构时发生了重复释放。
稍微明白点了 我把string 改成char*就好了,这是太感谢了!
bluewanderer 2013-05-07
  • 打赏
  • 举报
回复
呃... 没好好看你程序。以为是你直接用了已经释放的对象里的指针了... 不过事实上你还是用了已经施放的对象里的指针了,string(包括任何你不可能知道结构的对象——标准里没规定string的具体实现)是不能直接这样保存到文件的。VC里你这么干写入文件的是string里指向真正字符串内容的指针,相当于间接把这个本来不能复制的指针复制给了另一个string,到只两个string析构时发生了重复释放。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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