使用fstream从二进制文件中读取并将结果存储在向量中



我正在为我的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] << " ";
}

从理论上讲,向量应将所有整数放在文件中并将其打印到stdout,但是我的输出仅为50,000,0s,其次是program exited with exit code 0我对C 语法和库相对较新,我只是无法弄清楚自己的一生做错了什么。预先感谢。

当您使用

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] << " ";
}

您说"您不提前知道"哪种数据(数据大小)存储在文件中。主要问题是确定数据的尺寸及其数据类型。因此,您可以做什么,创建自定义的FEMATE文件。

for ex。

  • 文件的第1个字节将指示数据类型(ex。Ifor Integer,f for for for for for for for for for for for for for char*(char)for 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;

现在您拥有数据的数据类型和大小,因此请相应地创建或调整大小。