读者和作家

#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[]),并进行解析。

10-02 01:06
查看更多