一种比阅读结构更受欢迎的方法 - 如您所见,其内存布局可能会有所不同 - 按原样减少其大小可能是可行的方法。
也就是说,您可以大块读取文件并在需要的部分中剪切数据。然后你读出一个字段一个字段并将数据放入你的目标数组中。就像是
float read_float(void ** data) {
float ** fp = data;
float ret = **fp; (*fp)++;
return ret;
}
point read_point(void ** data) {
point ret;
ret.x = read_float(data);
ret.y = read_float(data);
ret.z = read_float(data);
return ret;
}
int16_t read16(void ** data) {
int16_t ** i16p = data;
int16_t ret = **i16p; (*i16p)++;
return ret;
}
point read_triangle(void ** data) {
triangle ret;
ret.normal_vector = read_point(data);
ret.p1 = read_point(data);
ret.p2 = read_point(data);
ret.p3 = read_point(data);
ret.notuse = read_int16(data); // using short int is not portable as well as its size could vary...
return ret;
}
void * scursor = source_array; // which would be a char array
while (scursor < source_array + sizeof(source_array)) {
// make sure that there are enough data present...
target[tcursor++] = read_triangle(&scursor); // the scursor will be advanced by the called function.
}
这种方式也可以 - 通过某些增强 - 用于保持例如数字的字节序相同 - 在旨在在平台之间交换的文件上最好是大字节序。更改read16
会很小,更改会read_float
更大一些,但仍然可行。