读/写字符串到二进制文件
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;
【讨论】:
以上是关于读/写字符串到二进制文件的主要内容,如果未能解决你的问题,请参考以下文章