无法读取二进制数据

时间:2013-04-16 15:28:24

标签: c++ fstream

读者和作家

#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个字节读回的数据会损坏?

2 个答案:

答案 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有意义。