2011-03-26 860 views
5

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

Respuesta

10

El error está en esta línea:

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

Lo que queremos es:

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

Los sizeof(img.c_str()) retornos 4 porque sizeof(char *) (el tipo de retorno de c_str()) es 4 en tu plataforma. Esto significa que se escriben los primeros 4 caracteres y luego se obtiene algo de basura.

+0

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

+0

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. –

+0

De acuerdo, estableciendo la longitud a 11 trabajado. – Chris

Cuestiones relacionadas