【问题标题】:Using fstream to read from a binary file and store the results in a vector使用 fstream 从二进制文件中读取并将结果存储在向量中
【发布时间】:2017-09-14 22:12:25
【问题描述】:

我正在为我的 CS202 课程做一个项目。我提供了一个名为data.dat 的未知大小的二进制文件,需要从文件中读取整数(我事先不知道)并将它们存储在适当大小的向量中。我必须将fstream() 用于文件流,我必须使用reinterpret_cast<char *>() 进行转换。我的代码如下所示:

fstream filestream2;
//reading binary data from supplied data.dat file
filestream2.open("data.dat", ios::in | ios::binary);
vector<int> v;
filestream2.seekg(0, filestream2.end);
long length = filestream2.tellg();
v.resize(length);
filestream2.read(reinterpret_cast<char *>(&v[0]), length);
for(int num = 0; num < length; num++)
{
    cout << v[num] << " ";
}

理论上,向量应该保存文件中的所有整数并将它们打印到标准输出,但我的输出只是大约 50,000,0 后跟program exited with exit code 0 我对 C++ 语法和库还比较陌生,我只是无法弄清楚我一生做错了什么。 提前致谢。

【问题讨论】:

    标签: c++ c++11 fstream binaryfiles stdvector


    【解决方案1】:

    当你使用

    filestream2.seekg(0, filestream2.end);
    long length = filestream2.tellg();
    

    您得到的是文件中的字符数,而不是向量中的项目数。因此,当您想使用向量的大小时,您需要使用length/sizeof(int)。

    v.resize(length);
    

    不正确。应该是

    v.resize(length/sizeof(int));
    

    和

    for(int num = 0; num < length; num++)
    {
        cout << v[num] << " ";
    }
    

    不正确。应该是

    for(int num = 0; num < length/sizeof(int); num++)
    {
        cout << v[num] << " ";
    }
    

    【讨论】:

      【解决方案2】:

      您说“您事先不知道”文件中存储了哪种数据(数据大小)。主要问题是识别数据的大小及其数据类型。所以你能做的是,创建自定义的甲酸盐文件。

      例如

      • 文件的第一个字节将指示数据的类型,(例如,I 表示整数,F 表示浮点数,U 表示无符号整数,C 表示 char,S 表示 char*(字符串)等等)
      • 接下来的 4 个字节将是数据的大小(仅 char* 需要,因此它是可选的)
      • 之后将开始实际日期。

      所以数据将在文件中像

      Cabcdefghijk
      

      这里第一个字节是 C,所以数据是 char。所以需要创建char类型的向量。

      下一个数据大小:

      fstream.seekg(0, fstream.end);
      long length = fstream.tellg(); //  length : 12
      
      length -= 1; // 1st byte is indecator // length : 11
      
      // length -= 4; // Optional : if you had write size of data
      length = length / sizeof( char); //  sizeof( int) or sizeof( flot) or written in file.
      // so in our case length will be 11;
      

      现在您有了数据的数据类型和大小,因此可以相应地创建或调整向量的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        相关资源
        最近更新 更多