2011-03-26 19 views
5

तो मैं फ़ाइल में लिखने के लिए इस कोड का उपयोग कर रहा है (बस अब परीक्षण, मैं बाद में एक स्तर संपादक लिखने के लिए जा रहा हूँ): एक स्ट्रिंग लेखन


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

कोड मैं मीटर लोड करने के लिए इसका उपयोग यह है:

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

सब कुछ स्ट्रिंग लोडिंग को छोड़कर ठीक काम करता है। मुझे उम्मीद है कि मैं इसे गलत लिख रहा हूं, प्लेटफार्म के बजाए यह छवि को लोड करते समय प्लैटेटेट और त्रुटियों को दिखाता है। मैं स्ट्रिंग को इसकी लंबाई के साथ भी उपसर्ग कर रहा हूं। बाइनरी फ़ाइल में स्ट्रिंग लिखने का सही तरीका क्या है? क्या corre

उत्तर

10

त्रुटि इस लाइन पर है:

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 अक्षर लिखे गए हैं और फिर आपको कुछ कचरा मिलता है।

+0

यह काम करता है, सिवाय इसके कि कुछ अजीब कारणों से स्ट्रिंग के अंत में एक अतिरिक्त जी जोड़ा गया है। मैं आकार को 11 तक कम करने की कोशिश करूंगा और देख सकता हूं कि यह कुछ भी करता है या नहीं। – Chris

+0

नल वर्ण ओपी के कोड (आपके सुधार के साथ) के लिए कोई समस्या नहीं होनी चाहिए। यह कभी नहीं मानता कि '\ 0' 'स्ट्रिंग टर्मिनेटर के रूप में कार्य करता है और यह कभी भी सी स्टाइल स्ट्रिंग का उपयोग नहीं करता है। –

+0

ठीक है, लंबाई को 11 तक सेट किया गया। – Chris

संबंधित मुद्दे