我想在写入过程完成后从二进制文件中读取数据,也可以在没有写入过程的情况下读取数据

I wanna read data from my binary file after the writing process complete and also read data without the writing process

本文关键字:读取 数据 过程 情况下 也可以 二进制文件      更新时间:2023-10-16

这是我编写二进制文件的部分代码。这里我传递一个2d矢量表,其中包含文本格式数据或二进制数据。如果主表包含二进制数据,我想读取并加载到一个向量表中。我已经做过了,如果数据是文本文件,我可以从文件中加载数据,但如果是二进制数据,我不知道如何加载。我也使用索引表。这意味着该表包含主表中每个字段的大小。

例如

:emp.idx

field - Size

name - 20

年龄- 2岁

性- 10

mainTbl -包含二进制数据的主表。

typedef vector <string> record_t;
typedef vector <record_t> table_t;
table_t mainTbl;
table_t fileStruct::FormatData(table_t &mainTbl)
{
fstream fs("emp.bin",ios::binary | ios::out | ios::in); 
size_t rowLength=mainTbl.size();
size_t colLength=idxTbl.size();
count_t  colSize;
    for (size_t j=0;j<colLength;j++)
    {
        colSize.push_back(idxTbl[j].fsize);
        //cout<<"colum size "<<colSize[j]<<endl;
    }

    for(size_t i=0;i<rowLength;i++)
    {
    for (size_t j=0;j<colLength;j++)
        {
        string data=mainTbl[i].at(j);
        data.resize(colSize.at(j),' ');
        mainTbl[i].at(j)=data;
        int len = data.length();
        fs.write(reinterpret_cast<char*> (&len),len);
        fs.write(const_cast<char*>(data.c_str()),len);
        //cout<<data;
        //fu<<mainTbl[i].at(j);
        }
    fs<<endl;
    //cout<<endl;
    }
    return mainTbl;
 }

你的代码写错了

fs.write(reinterpret_cast<char*> (&len),len);
应该

fs.write(reinterpret_cast<char*>(&len), sizeof len);

read可以读入临时vector对象,并从中创建string对象。

vector<char> temp;
fs.read(reinterpret_cast<char*>(&len), sizeof len);
if (len > 0)
{
    temp.resize(len);
    fs.read(&temp[0], len);
}
mainTbl[i].at(j) = string(temp.begin(), temp.end());