2017-09-14 32 views
0

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

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,其次是program exited with exit code 0 0我是比较新的C++语法和库,我只是无法弄清楚我为我的生活做错了什么。 在此先感谢。

回答

2

当您使用

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

你说“你不知道”哪种数据(大小的数据)存储在文件中。主要问题是确定数据的大小及其数据类型。那么你可以做什么,创建自定义的合成文件。

例如,

    文件的
  • 第一字节将指示数据的类型,(例如:我为整数,F浮法,U为无符号整型,C为炭,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; 

现在你有数据类型和数据的大小,所以相应地建立或调整向量。

相关问题