我想要实现的目标是:
假设我有一个班级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之间)。
我觉得这有点啰嗦,但我试图真正解释自己!我希望我做到了!
无论如何,我不是在找人告诉我如何做到这一切。
我所追求的是如何对文件进行初始保存。
感谢您提出任何建议。
答案 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,但还有许多其他实施。
您是否需要该文件才能被人类阅读?如果是,请考虑,例如,XML
或JSON
格式。
您不需要它是可读的,但希望它尽可能紧凑吗?考虑google protobuf
刚开始这样做,并提出更具体的问题。
如前所述,将字符串保留为std:string
个对象,而不是char*
关于在C ++中写入/读取文件,请阅读fstream