求指点:C++类对象进行文件读取后出现的xutility错误

漠河的魔盒 2018-03-08 09:29:20
错误:
执行完system("pause"); 手动输入键之后会出现xutility程序错误。 错误弹出框见图片

// MEMBER FUNCTIONS FOR _Container_base12
inline void _Container_base12::_Orphan_all()
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != 0)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);

for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Myproxy = 0; // 报错的行
_Myproxy->_Myfirstiter = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}



代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class Book
{
public:
string No;
string Name;
string Author;
double Price;
int Number;

Book()
{
cout << "构造Book对象" << endl;
}

Book(const Book &rhs)
{
this->No = rhs.No;
this->Name = rhs.Name;
this->Author = rhs.Author;
this->Price = rhs.Price;
this->Number= rhs.Number;

cout << "拷贝构造函数 " + this->Name << endl;
}

Book(string o,string n,string a,double p,int u)
:No(o),Name(n),Author(a),Price(p),Number(u)
{
cout << "构造 "+ n << endl;
}

~Book()
{
cout<<"析构 "<<Name<<endl;
}

friend ostream & operator<< (ostream &output,Book &s)
{
output << "编号: " << s.No << endl
<< "书名: " << s.Name<< endl
<< "作者: " << s.Author<< endl
<< "价格: ¥" << s.Price<< endl
<< "数量: " << s.Number<< endl;
return output;
}

friend istream & operator>> (istream &input,Book &s)
{
input >> s.No >> s.Name >> s.Author >> s.Price >> s.Number;
return input;
}
};


int main()
{

ifstream input,input2;
ofstream output,output2;

vector<Book> vb;
Book b1("AA-AABB","自然百科","yaoshuangqi",20.5,11);
Book b2("AA-ACBB","恐龙百科","chenerqian",20.5,17);
Book b3("XA-AABB","C++ Prime","Stanley B. Lippman",128.00,1);
Book b4("XA-AXBB","深入浅出C++","Lvxiaona",54.20,7);
Book b5("XA-AXFB","HTML","Lvxiaona",54.20,7);

vb.push_back(b1);
vb.push_back(b2);
vb.push_back(b3);
vb.push_back(b4);
vb.push_back(b5);

int x =0;
output2.open("2.txt",ios::binary);
if(output2.is_open())
{
for(auto it = vb.begin(); it != vb.end();++it)
{
output2.write((char *)&(*it),sizeof(*it));
//output2.flush();
x++;
}
output2.close();
}

// 按照类对象读取
int y=0;
input2.open("2.txt",ios::binary);
if(input2.is_open())
{
Book b ;
while(!input2.eof())
{
y++;
input2.read((char *)&b,sizeof(Book));
if(input2.rdstate()) break;
cout << b << endl;
}
input2.close();
}

// vector存放类对象的时候,释放vector内存 其实没有必要
vector<Book>(vb).swap(vb);

system("pause");
return 0;
}
...全文
1543 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
夏侯冉 2019-04-11
  • 打赏
  • 举报
回复
我也遇到了同样的问题,按照你最后的结论,用char[]来代替string确实不出现这个问题了,但还是没弄明白为啥用string,就会跳到xutility那个函数,总说_Pnext为ox......;访问权限冲突!
mstlq 2018-03-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
book是类,不是一段内存,不能使用write和read。 百度搜“序列化 反序列化”
少有的,这回我支持赵老师这个复制粘贴…… 请楼主搜索“序列化 反序列化”
漠河的魔盒 2018-03-08
  • 打赏
  • 举报
回复
引用 2 楼 wanggui2015 的回复:
问题就出在你把string对象的二进制直接写到文件了,然后又再读出来,那肯定就有问题啊。string对象里面肯定是维护了一段内存,但是他存的是这段内存的地址,你只是把内存地址写到了文件中,而没有把内存中实际的内容写到文件中。 把Book结构体里面的string改成字符数组应该就没问题了。
类中的string修改为char* 后一起读写是没有问题了,但是单独读写又有问题: 第一次 数据写入文件 ok 第二次 从文件中读取数据 有时可读取,但是读取的字符串已经都是乱码 后续再读取数据都是报错,此时的错误是strlen.asm,弹出的错误提示框和前面的类似。
wallesyoyo 2018-03-08
  • 打赏
  • 举报
回复
问题就出在你把string对象的二进制直接写到文件了,然后又再读出来,那肯定就有问题啊。string对象里面肯定是维护了一段内存,但是他存的是这段内存的地址,你只是把内存地址写到了文件中,而没有把内存中实际的内容写到文件中。 把Book结构体里面的string改成字符数组应该就没问题了。
赵4老师 2018-03-08
  • 打赏
  • 举报
回复
book是类,不是一段内存,不能使用write和read。 百度搜“序列化 反序列化”
漠河的魔盒 2018-03-08
  • 打赏
  • 举报
回复
解决了,是类设计错误了。

public:
	char No[20];
	char Name[40];
	char Author[40];
	double Price;
	int    Number;
字符串需要确定的字符长度,否则读取的时候读取不到。
漠河的魔盒 2018-03-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
book是类,不是一段内存,不能使用write和read。 百度搜“序列化 反序列化”
百度百科上的定义:序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 我看了网上的一些案例,感觉写文本就是序列化啊,关于你说的“book是类,不是一段内存,不能使用write和read”可以详细一点吗,我是从C#界面开发转过来的对于内存相关的处理不是很理解。
wallesyoyo 2018-03-08
  • 打赏
  • 举报
回复
把你改过的代码发出来我看看。
引用 3 楼 qq_24700911 的回复:
[quote=引用 2 楼 wanggui2015 的回复:] 问题就出在你把string对象的二进制直接写到文件了,然后又再读出来,那肯定就有问题啊。string对象里面肯定是维护了一段内存,但是他存的是这段内存的地址,你只是把内存地址写到了文件中,而没有把内存中实际的内容写到文件中。 把Book结构体里面的string改成字符数组应该就没问题了。
类中的string修改为char* 后一起读写是没有问题了,但是单独读写又有问题: 第一次 数据写入文件 ok 第二次 从文件中读取数据 有时可读取,但是读取的字符串已经都是乱码 后续再读取数据都是报错,此时的错误是strlen.asm,弹出的错误提示框和前面的类似。 [/quote]

64,649

社区成员

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

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