使用 fstream 读取二进制文件并将结果存储在向量中
Using fstream to read from a binary file and store the results in a vector
我正在为我的 CS202 class 做一个项目。我有一个名为 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++ 语法和库还比较陌生,我一辈子都弄不明白自己做错了什么。
提前致谢。
当你使用
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] << " ";
}
你说"you don't know in advance"文件中存储了哪种数据(数据大小)。主要问题是识别数据的大小及其数据类型。那么您可以做的是创建自定义甲酸盐文件。
例如
- 文件的第一个字节将指示数据类型,(例如,I 表示整数,F 表示浮点数,U 表示无符号整数,C 表示字符,S 表示 char*(字符串)等等)
- 接下来的 4 个字节将是数据的大小(仅对于 char* 是必需的,因此它是可选的)
- 实际日期将在该日期之后开始。
因此数据将像
一样存储在文件中
Cabcdefghijk
这里第一个字节是 C,所以数据是字符。所以需要创建char类型的vector。
下一个数据大小:
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;
现在你有了数据类型和数据大小,因此相应地创建或调整向量大小。
我正在为我的 CS202 class 做一个项目。我有一个名为 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++ 语法和库还比较陌生,我一辈子都弄不明白自己做错了什么。
提前致谢。
当你使用
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] << " ";
}
你说"you don't know in advance"文件中存储了哪种数据(数据大小)。主要问题是识别数据的大小及其数据类型。那么您可以做的是创建自定义甲酸盐文件。
例如
- 文件的第一个字节将指示数据类型,(例如,I 表示整数,F 表示浮点数,U 表示无符号整数,C 表示字符,S 表示 char*(字符串)等等)
- 接下来的 4 个字节将是数据的大小(仅对于 char* 是必需的,因此它是可选的)
- 实际日期将在该日期之后开始。
因此数据将像
一样存储在文件中Cabcdefghijk
这里第一个字节是 C,所以数据是字符。所以需要创建char类型的vector。
下一个数据大小:
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;
现在你有了数据类型和数据大小,因此相应地创建或调整向量大小。