读者和作家
#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个字节读回的数据会损坏?
答案 0 :(得分:2)
您不能简单地通过将数据转换为char*
来编写数据,并希望获得有用的信息。您必须定义要使用的二进制格式并实现它。在std::string
的情况下,这可能意味着以某种格式输出长度,然后输出实际数据。或者在需要固定长度字段的情况下,使用std::string::resize
将字符串(或字符串的副本)强制转换为该长度,然后使用std::string::data()
输出,以获取char const*
当然,阅读将是类似的。您将数据读入std::vector<char>
(或固定长度字段,char[]
)并解析。
答案 1 :(得分:0)
binary_search_file.write(reinterpret_cast<char *>(&attribute), attribute.length() * 2);
如果您需要std::string
,必须使用char*
,将char*
投放到attribute.c_str()
是不正确的。
std :: string除了字符串指针之外还包含其他数据成员,例如allocator,你的代码会将所有那些数据写入文件。此外,我认为没有任何理由将字符串长度乘以2.如果要输出终止零,则+1有意义。