我正在为我的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;
现在您拥有数据的数据类型和大小,因此请相应地创建或调整大小。