Así que estoy utilizando este código para escribir el archivo (haciendo una prueba ahora, voy a escribir un editor de niveles más adelante): escribir una cadena de presentar en modo binario
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;
}
El código I' m usar para cargarlo es esto:
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(); }
Todo funciona bien, excepto la carga de cadenas. Supongo que lo estoy escribiendo mal, ya que en lugar de la plataforma.png muestra plattttttttt y errores cuando carga la imagen. También prefijo la cuerda con su longitud. ¿Cuál es la forma correcta de escribir una cadena en un archivo binario? ¿Cuál es el corre
Eso funcionó, excepto que agregó un g adicional en el extremo de la cuerda por alguna extraña razón. Trataré de disminuir el tamaño a 11 y ver si eso hace cualquier cosa. – Chris
Los caracteres nulos no deberían ser un problema para el código del OP (con su corrección). Nunca se supone que ''\ 0'' actúa como un terminador de cadena y nunca usa cadenas de estilo C. –
De acuerdo, estableciendo la longitud a 11 trabajado. – Chris