读/写字符串到二进制文件

Posted

技术标签:

【中文标题】读/写字符串到二进制文件【英文标题】:Reading / Writing Strings to Binary Files 【发布时间】:2015-12-21 01:24:00 【问题描述】:

过去一天我遇到了一个我无法解决的错误。

我有我的第一个方法是保存玩家数据:

    bool Player::savePlayerData() 
    ofstream writeFile(getName() + ".bin", ios::out | ios::binary | ios::trunc);
    
    string writeData;

    writeData = formatEntityData() + "<" + formatLocationData() + "<" + formatInventory();

    writeFile.write(writeData.c_str(), writeData.length() + 1);

    writeFile.close();

    return true;

注意:假设 getName()、formatEntityData()、formatLocationData() 和 formatInventory() 返回字符串并且可以正常工作。

然后我有我的加载播放器数据方法:

bool Player::loadPlayerData(string name) 
    ifstream readFile(name + ".bin", ios::in | ios::binary | ios::_Nocreate);
    if (readFile.good() && readFile.is_open()) 

        string data;
        getline(readFile, data, '\0');

        vector<string> str = split(data, '<');
        parseEntityData(str.at(0));
        parseLocationData(str.at(1));
        parseInventory(str.at(2));

        readFile.close();
        return true;
    
    readFile.close();
    return false;

注意:假设 parseEntityData()、parseLocationData()、parseInventory() 有字符串参数,返回 void 并且是函数 注意:假设 split(string, char) 接收一个带分隔符的字符串。 char 并正确拆分为向量


所以,这就是我想要完成的事情(为了简单起见,我们假设 getName() 返回“luke”):

•创建 luke.bin

•将字符串以二进制形式保存到luke.bin

•以字符串形式从luke.bin加载数据

当我运行程序时没有正确读取播放器数据。相反,它返回好像文件中没有任何内容。我究竟做错了什么?任何提示、想法或想法将不胜感激。

关于兄弟的代码!

【问题讨论】:

it is normal ACSII text not that weird binary stuff 好吧,你给它写普通的 ASCII 文本——你为什么期望它神奇地变成“奇怪的二进制东西”,不管它是什么? it is not properly reading the data in the file“不正确”到底是什么意思?您观察到什么结果,您期望什么,两者有何不同? 通常,当您在 notepad++ 中打开二进制文件时,它会给出看似随机的字符,而不是实际的字符。但是,更重要的问题是它没有读取写入的数据。 【参考方案1】:

通常,当您在记事本++ 中打开二进制文件时,它看似 随机字符

这取决于数据。字符串"Hell world" 在二进制或文本中是相同的。如果是文本格式,数字将显示为文本。

文本格式示例:

fout << 1234 << std::endl; //saved as "1234"

二进制数据示例:

int i = 1234;
fout.write(&i, sizeof(i)); //saved as 2 bytes, big-endian or little endian binary

ios::binary 停止转换换行符。

写入文件时,输入准确大小:

writeFile.write(writeData.c_str(), writeData.length());

读取文件时, getline(fin, data, '\0'); 将在到达零或文件末尾时停止。您应该使用 EOF 而不是零。更好的是,使用这种方法:

std::ifstream f(filename, ios::binary);
if (f.good())

    f.seekg(0, ios::end);
    size_t filesize = (size_t)f.tellg();
    f.seekg(0);

    std::string data(filesize, 0);
    f.read(&data[0], filesize);
    cout << data << endl;
    return true;

return false;

【讨论】:

以上是关于读/写字符串到二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

golang 读写二进制文件

IO-字符输入流

C++ 用二进制文件读/写对象

Java程序设计输入输出

c# 将字符串以二进制形式写入文件

C语言文件操作