0

读者和作家

#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   ");

writer 总共写入 50 个字节

"packard   101       500  "

读者将阅读第一个20 bytes,结果是“X packard X”,其中X表示一些格式错误的数据字节。为什么以 x 字节数读回的数据损坏?

4

2 回答 2

2

您不能通过将数据的地址转换为 achar*并希望得到任何有用的东西来简单地写出数据。您必须定义要使用的二进制格式并实现它。在 的情况下std::string,这可能意味着以某种格式输出长度,然后是实际数据。或者在需要固定长度字段的情况下,使用 强制字符串(或字符串的副本)到该长度std::string::resize,然后输出该长度,std::string::data()使用char const*.

当然,阅读也是类似的。您会将数据读入 a std::vector<char>(或对于固定长度字段, a char[]),然后解析它。

于 2013-04-16T15:34:08.387 回答
0

binary_search_file.write(reinterpret_cast<char *>(&attribute), attribute.length() * 2);
如果std::string需要,char*必须char*使用attribute.c_str().
std::string 除了字符串指针还包含其他数据成员,例如分配器,您的代码会将所有这些数据写入文件。此外,我看不出有任何理由将字符串长度乘以 2。如果要输出终止零,+1 是有意义的。

于 2013-04-16T15:32:03.183 回答