保存对象的变量,然后能够使用这些变量初始化另一个对象

时间:2016-07-29 12:01:51

标签: c++

我想要实现的目标是:

假设我有一个班级Score。此类有一个int变量和一个char*变量。

现在,当我有一个对象Score score时,我希望能够保存这些变量的值(我想是一个文件)。所以现在这个文件有一个int变量和一个char*变量,我可以稍后访问该变量来创建一个新的Score对象。

所以我创建了Score score(10, "Bert");。我要么做score.SaveScore();之类的事情,要么在游戏结束或节目退出时保存得分,这没关系。

基本上我正在寻找这样做的等效/正确方法:

score.SaveScore(FILE file)
{
    file.var1 = score.score;
    file.var2 = score.name;
}

我意识到这可能是非常愚蠢的,而且不是这样做的!这只是我试图以最简单的方式解释我想要实现的目标。

无论如何,当我再次运行程序时,原来的Score score(10, "Bert")不再存在。但我希望能够访问保存的分数(从文件或任何地方)并创建另一个分数对象。

所以它可能看起来像:

LoadScore(FILE file)
{
    Score newScore(file.var1, file.var2);
}

再一次,试图展示我想要实现的目标。

我希望能够再次访问变量的原因是最终有一个记分板,记分板会从文件中加载一堆分数。

然后,当创建一个新分数时,它会被添加到记分板,与记分板中当前的其他分数相比并插入到正确的位置(如6分的分数将介于9和4之间)。

我觉得这有点啰嗦,但我试图真正解释自己!我希望我做到了!

无论如何,我不是在找人告诉我如何做到这一切。

我所追求的是如何对文件进行初始保存。

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:1)

我会使用<fstream>库,就像这样;

//example values
int x=10; 
float y=10.5;
const char* chars = "some random value";
string str(chars); //make string buffer for sizing
str.resize(20); //make sure its fixed size

//open a test.txt file, in the same dir for output
std::ofstream os("test.txt", std::ios::out | std::ios::binary); //make it output binary 

//(char*) cast &x, sizeof(type) for values/write to file chars for x and y
os.write((char*)&x, sizeof(int)); //only sizeof(int) starting at &x
os.write((char*)&y, sizeof(float)); //cast as a char pointer
os.write(str.data(), sizeof(char)*str.size()); //write str data
os.close();

//the file test.txt will now have binary data in it

//to read it back in, just ifstream, and put that info in new containers, like this;
int in_x = 0; //new containters set to 0 for debug
float in_y = 0;
char inchar[20]; //buffer to write 20 chars to

ifstream is("test.txt", std::ios::in | std::ios::binary); //read in binary

is.read((char*)&in_x, sizeof(int)); //write to new containers
is.read((char*)&in_y, sizeof(float));
is.read((char*)&inchar, sizeof(char)*20); //write char assuming 20 size
is.close();


//outputting will show the values are correctly read into the new containers
cout << in_x << endl;
cout << in_y << endl;
cout << inchar << endl;

答案 1 :(得分:0)

  

我意识到这可能是非常愚蠢的,而且不是这样做的!

整个软件行业愚蠢到完成了这么多次,甚至为这个操作发明了一个特殊术语 - serialization几乎所有C ++框架和库都以各种方式实现了这一点。 由于问题标有C++,我建议您查看boost serialization,但还有许多其他实施。

您是否需要该文件才能被人类阅读?如果是,请考虑,例如,XMLJSON格式。

您不需要它是可读的,但希望它尽可能紧凑吗?考虑google protobuf

刚开始这样做,并提出更具体的问题。

如前所述,将字符串保留为std:string个对象,而不是char*

关于在C ++中写入/读取文件,请阅读fstream