读者和作家
#include<string>
#include<fstream>
#include<memory>
class BinarySearchFile{
BinarySearchFile::BinarySearchFile(std::string file_name){
// concatenate extension to fileName
file_name += ".dat";
// form complete table data filename
data_file_name = file_name;
// create or reopen table data file for reading and writing
binary_search_file.open(data_file_name, std::ios::binary); // create file
if(!binary_search_file.is_open()){
binary_search_file.clear();
binary_search_file.open(data_file_name, std::ios::out | std::ios::binary);
binary_search_file.close();
binary_search_file.open(data_file_name), std::ios::out | std::ios::in | std::ios::binary | std::ios::ate;
}
std::fstream binary_search_file;
void BinarySearchFile::writeT(std::string attribute){
if(binary_search_file){
binary_search_file.write(reinterpret_cast<char *>(&attribute), attribute.length() * 2);
}
}
std::string BinarySearchFile::readT(long filePointerLocation, long sizeOfData)
{
if(binary_search_file){
std::string data;
data.resize(sizeOfData);
binary_search_file.seekp(filePointerLocation);
binary_search_file.seekg(filePointerLocation);
binary_search_file.read(&data[0], sizeOfData);
return data;
}
};
读者来电
while (true){
std::unique_ptr<BinarySearchFile> data_file(new BinarySearchFile("classroom.dat"));
std::string attribute_value = data_file->read_data(0, 20);
}
作家打电话
data_file->write_data("packard ");
作家总共写了50个字节
"packard 101 500 "
读者将读取第一个
20 bytes
,结果为“ X packard X”,其中X
代表某些格式错误的数据字节。为什么读回的x字节数据损坏了? 最佳答案
您不能简单地通过将数据的地址强制转换为char*
并希望获得有用的数据来写出数据。您必须定义要使用的二进制格式并实现它。对于std::string
,这可能意味着以某种格式输出长度,然后输出实际数据。或者,在需要固定长度字段的情况下,使用std::string::resize
将字符串(或字符串的副本)强制为该长度,然后使用std::string::data()
将其输出以得到char const*
。
阅读当然是相似的。您将数据读入std::vector<char>
(或对于固定长度字段为char[]
),并进行解析。