【发布时间】:2019-01-08 19:46:38
【问题描述】:
我有一个扩展名为 .b16 的二进制文件,包含的信息为无符号整数(范围 0..65535,文件扩展名 .b16,字节顺序:低字节/高字节)。
主要文件是 otypes03.b08 到 otypes08.b08、otypes09.b16 和 otypes10.b16。它们包含所有不等价的坐标 给定点数 n 的点集(订单类型)。
我已成功读取所有扩展名为 .b08 的文件,但是在读取 .b16 文件时,我没有得到预期的信息。
到目前为止我所拥有的:(这是读取算法的修改版本,专门用于 .b16 格式)
int readPoints(int n, string file_name, vector<Point> & vPoints){
ifstream input(file_name, std::ios::binary);
if(input.fail()) return 1;
vector< unsigned char> buffer(std::istreambuf_iterator<char>(input), {});
//Copying each pair of binary points to a vector of Point objects
Point temp;
for( unsigned int i=0;i< buffer.size();i+=4){
temp.x = buffer[i] | buffer[i+1] ;
temp.y = buffer[i+2] | buffer[i+3] ;
vPoints.push_back(temp);
}
return 0;
}
文件的每个元素都是平面中一个点的坐标,但是我似乎读错了,读取的坐标不是应该的。我不知道我做错了什么。
我用于 .b08 格式的内容:
//Reads a file of binary points and stores it on vector vPoints.
int readPoints(int n, string file_name, vector<Point> & vPoints){
ifstream input(file_name, std::ios::binary);
if(input.fail()) return 1;
// copies all data into buffer
//Stored as unsigned int. Arithmetic operations (+-*/) can be used! :)
//Can be treated as signed int or unsigned int.
vector< unsigned char> buffer(std::istreambuf_iterator<char>(input), {});
//Copying each pair of binary points to a vector of Point objects
Point temp;
cout << "Buffer size: " << buffer.size() << endl;
for( unsigned int i=0;i< buffer.size();i+=2){
temp.x = buffer[i];
temp.y = buffer[i+2];
vPoints.push_back(temp);
}
return 0;
}
关于我正在使用的数据库的更多信息在这里: http://www.ist.tugraz.at/aichholzer/research/rp/triangulations/ordertypes/
我要读取的文件是 otypes09.b16,大小为 5.7MB,以防您想尝试一下。
感谢您的宝贵时间。
【问题讨论】:
-
您有两种选择: 1) 将 16 位文件读入内存,然后根据需要交换字节;或 2) 一次读取两个字节,组装成正确的字节序并存储到内存中。
-
字节顺序是否可能与您的系统不同?如果是这样,您应该在读取文件时交换字节顺序
-
顺便说一句,如果文件的字节顺序与您的系统相同,则以16位读取数据,无需转换。
标签: c++ binaryfiles binary-data