2011-03-26 10 views
5

Yani dosyası yazmak için bu kodu kullanıyorum ikili modda dosyaya: (ben daha sonra bir seviye editörü yazacağım şimdi test)


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; 
} 

Ben kodu Yüklemek için m şu şekilde kullanılır:

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(); }

Her şey dize yüklemesi dışında iyi çalışıyor. Platform.png yerine görüntüyü yüklediğimde plattttttttt ve hataları gösterdiği gibi yanlış yazarım. Ben de uzunluğa sahip dizeyi önekliyorum. Bir ikili dosyaya dize yazmanın doğru yolu nedir?

cevap

10

hata bu satırda yer almaktadır CORRE Nedir:

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

Ne istiyorsun geçerli:

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

sizeof(img.c_str()) döner 4 sizeof(char *) (c_str() dönüş türü) 4 olduğu için platformunda. Bu, ilk 4 karakterin yazıldığı ve daha sonra sadece bir çöp aldığınız anlamına gelir.

+0

Bu işe yaradı, ancak bazı garip nedenlerden dolayı dizenin sonuna ekstra bir g ekledi. Boyutu 11'e düşürmeyi ve bunun bir şey yapıp yapmadığını görmeyi deneyeceğim. – Chris

+0

Boş char'lar OP’nin kodu için bir sorun olmamalıdır (düzeltmenizle birlikte). Asla "\ 0" dizgesini bir dize sonlandırıcı olarak görür ve asla C stili dizeleri kullanmaz. –

+0

Tamam, uzunluğu 11'e ayarladı. – Chris

İlgili konular