C++ 存储类的对象为文件的问题
如题,我变了一个类,想存成文件。voidplayer::save(){fstreamf;f.open("save.dat",ios::out);f<<*this<<end...
如题,我变了一个类,想存成文件。
void player::save()
{
fstream f;
f.open("save.dat",ios::out);
f<<*this<<endl;
f.close();
}
编译通不过,请问怎么才能直接存储类,存储之后又该如何读取,谢谢各位~~ 展开
void player::save()
{
fstream f;
f.open("save.dat",ios::out);
f<<*this<<endl;
f.close();
}
编译通不过,请问怎么才能直接存储类,存储之后又该如何读取,谢谢各位~~ 展开
4个回答
展开全部
首先,f<<*this<<endl;这句话您要表达什么意思
是要将类的数据成员输出到文件里面?还是按照一定的格式输出类的成员?还是完全相互不关联的操作?
你这样好比让C++编译器自己来决定做什么,但是计算机是死的,他不会帮你做
其实你这样做的主要的瓶颈是<<操作符
你可以在你的这个成员函数之前定义一个友元函数!~~记住,是之前定义,并且向前声明!~~~
friend ostream & operator <<(ostream &os,const player &p);//友元函数
你先定义友元函数就可以使用<<了
是要将类的数据成员输出到文件里面?还是按照一定的格式输出类的成员?还是完全相互不关联的操作?
你这样好比让C++编译器自己来决定做什么,但是计算机是死的,他不会帮你做
其实你这样做的主要的瓶颈是<<操作符
你可以在你的这个成员函数之前定义一个友元函数!~~记住,是之前定义,并且向前声明!~~~
friend ostream & operator <<(ostream &os,const player &p);//友元函数
你先定义友元函数就可以使用<<了
追问
我想要读取的时候方便,您能给个建议么?
追答
读取?...您的意思是从文件中读取回来么?....您可以按照特定的格式来存取
这样让别人看起来一目了然
还有一种方式是
采用二进制文件方式来存取
f.open("save.dat",ios::out|ios::binary);//最后个代表二进制写入
然后你在写入和读取的时候用write和read函数就可以了,止痒是二进制读取和写入
write语法:
ostream &write( const char *buffer, streamsize num );
write()函数用于输出流,从buffer中写num个字节到当前输出流中。
read语法:
istream &read( char *buffer, streamsize num );
函数read()用于输入流,在将字符放入buffer 之前从流中读取num
个字节。如果碰到EOF,read()中止,丢弃不论多少个字节已经放入。例如:
struct {
int height;
int width;
} rectangle;
input_file.read( (char *)(&rectangle), sizeof(rectangle) );
if( input_file.bad() ) {
cerr << "Error reading data" << endl;
exit( 0 );
}
展开全部
#include "iostream"
不是什么类都能存储的。比如类里面有复杂的数据结构,有对其他类的引用的内存指针。有系统资源的的引用。这种根本就不能存储。
不是什么类都能存储的。比如类里面有复杂的数据结构,有对其他类的引用的内存指针。有系统资源的的引用。这种根本就不能存储。
追问
那如果存储类的话有什么技巧么?只能一个数据元素一个数据元素的寸???
追答
你答对了,就是一个一个数据的处理,没有好的技巧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-08-29
展开全部
friend ostream & operator <<(ostream &os,const player &p){
// 假设p里面有2个成员啊,都是基本数据类型,不是基本类型的话也得重载过operator <<
os << a << b;
return os;
}
friend istream & operator >>(istream &is, player &p){
is >> a >> b;
return is;
}
// 假设p里面有2个成员啊,都是基本数据类型,不是基本类型的话也得重载过operator <<
os << a << b;
return os;
}
friend istream & operator >>(istream &is, player &p){
is >> a >> b;
return is;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自定义类 你必须实现自己的序列化操作
例如
class A : public CObject
{
A();
..............................
string Serialize();//序列化 这个返回值可以保存到文件
int UnSerialize(string info); //反序列化
virtual ~A();
};
void CPosition::Serialize(CArchive &ar)
{
//把你想要保存的成员变量的值 拼成字符串。 反序列化的时候 你使用A的新对象调用 UnSerialize() 解析这个字符串就恢复了原对象。
}
例如
class A : public CObject
{
A();
..............................
string Serialize();//序列化 这个返回值可以保存到文件
int UnSerialize(string info); //反序列化
virtual ~A();
};
void CPosition::Serialize(CArchive &ar)
{
//把你想要保存的成员变量的值 拼成字符串。 反序列化的时候 你使用A的新对象调用 UnSerialize() 解析这个字符串就恢复了原对象。
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询