gpt4 book ai didi

c++ - 以二进制方式将字符串写入文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:45 24 4
gpt4 key购买 nike

所以我正在使用这段代码来编写文件(现在只是测试,我稍后会写一个关卡编辑器):

 
int main()
{
ofstream file("level.bin", ios::binary);
int ents = 1; //number of entites
file.write((char*)&ents, sizeof(int));
float x = 300; //x and y coords
float y = 500;
file.write((char*)&x, sizeof(float));
file.write((char*)&y, sizeof(float));
int imglength = 12; //strings are prefixed by a length
file.write((char*)&imglength, sizeof(int));
string img = "platform.png"; //string
file.write(img.c_str(), sizeof(img.c_str()));
cout << "wrote\n";
return 0;
}

The code I'm using to load it is this:

 <p></p>

<p>void SceneManager::LoadScene(std::string filename)
{
std::ifstream file(filename.c_str(), std::ios::binary);
int ents;
file.read((char*)&ents, sizeof(int));
std::cout << ents << std::endl;
for(int i = 0; i < ents; i++)
{
//read x and y coords
float x;
float y;
file.read((char*)&x, sizeof(float));
file.read((char*)&y, sizeof(float));
std::cout << x << " " << y << std::endl;
int imglength;
file.read((char*)&imglength, sizeof(int));
std::cout << imglength << std::endl;
std::stringstream ss;
for(int k = 0; k <= imglength; k++)
{
//read string
char c;
file.read((char*)&c, sizeof(char));
ss << c;
}
std::string image = ss.str();
std::cout << image << std::endl;
phys_static ent;
Def edef;
edef.SetVal("x", x);
edef.SetVal("y", y);
edef.SetString("image", image);
ent.init(edef);
AddEntity(ent);
}
file.close();
}
</p>

除了字符串加载外,一切正常。我想我写错了,因为它显示的不是 platform.png,而是 plattttttttt 并且在我加载图像时出现错误。我还在字符串前面加上它的长度。将字符串写入二进制文件的正确方法是什么?什么是正确的

最佳答案

错误在这一行:

file.write(img.c_str(), sizeof(img.c_str()));

你想要的是:

file.write(img.c_str(), img.size());

sizeof(img.c_str()) 返回 4 因为 sizeof(char *)(c_str() 的返回类型)在您的平台上是 4。这意味着前 4 个字符被写入,然后你得到的只是一些垃圾。

关于c++ - 以二进制方式将字符串写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5442826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com