Запись строки в файл в двоичном режиме - PullRequest
5 голосов
/ 26 марта 2011

Итак, я использую этот код для записи файла (сейчас тестирую, позже я напишу редактор уровней):

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

Код, который я использую длязагрузить это так:

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

Все отлично работает, кроме загрузки строки.Я ожидаю, что я пишу это неправильно, так как вместо platform.png он показывает plattttttttt и ошибки, когда я загружаю изображение.Я также префикс строки с ее длиной.Как правильно записать строку в двоичный файл?Что является правильным

1 Ответ

10 голосов
/ 26 марта 2011

Ошибка в этой строке:

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 символа, а затем вы получаете просто мусор.

...