我有一个二进制数据文件.有超过4百万个LIDAR数据记录.每条记录都存储为四个数字 - 三个浮点数(坐标x,y,z)和一个整数(现在不重要).我应该实现一个在每个轴上获得最小和最大坐标的函数.我编写了下面的代码,算法看起来非常简单和简单,但它不起作用(它将每个最小值返回为0.0f,每个最大值返回1.0f).我有什么不对吗?
void get_min_max(const char *filename, float *a_min_x, float *a_max_x, float *a_min_y, float *a_max_y, float *a_min_z, float *a_max_z) {
FILE *f = NULL;
float x, y, z;
float min_x, min_y, min_z, max_x, max_y, max_z;
int l_type;
f = fopen(filename, "rb");
if (!f) {
printf("No binary file read!\n");
exit(-1);
}
min_x = min_y = min_z = std::numeric_limits<float>::max();
max_x = max_y = max_z = -std::numeric_limits<float>::max();
while (true) {
x = fread((void*)(&x), sizeof(x), 1, f);
y = fread((void*)(&y), sizeof(y), 1, f);
z = fread((void*)(&z), sizeof(z), 1, f);
min_x = fminf(x, min_x);
min_y = fminf(y, min_y);
min_z = fminf(z, min_z);
max_x = fmaxf(x, max_x);
max_y = fmaxf(y, max_y);
max_z = fmaxf(z, max_z);
l_type = fread((void*)(&l_type), sizeof(l_type), 1, f);
if (feof(f)) {
break;
}
}
fclose(f);
*a_min_x = min_x; // = 0.0f ???
*a_min_y = min_y; // = 0.0f ???
*a_min_z = min_z; // = 0.0f ???
*a_max_x = max_x; // = 1.0f ???
*a_max_y = max_y; // = 1.0f ???
*a_max_z = max_z; // = 1.0f ???
}
Run Code Online (Sandbox Code Playgroud)
您的问题是将fread结果分配给您的变量:
x = fread(&x, ...)
Run Code Online (Sandbox Code Playgroud)
首先fread将数据读入x,然后返回读取的元素数(1),然后x变为1.0.
你应该真正学会如何使用调试器,你会很快看到它.