57 c++ 读取二进制文件: 以.raw后缀的TDF_Voxel_Size文件为例
0 引言
毕业设计中用到了.raw格式的文件,需要将该文件按照M*N*P的矩阵格式加载到内存中。采用 #include <fstream> 中的FILE* 加载,并针对数据占用字节数,以 float* f = (float*) buffer; 语句强制转换类型,得到规整的文本数据。最后,由于数据量超出了 vector.max_size(),采用三维vector对数据进行存储,完成加载目标。
1 输入输出
输入包含两个文件, 分别是:
1、bicycle000002.size文件,包含数据格式描述({m, n, p, q});
2、bicycle000002.raw,序列化存储矩阵中的每一个数。
期望的输出:
将上述.raw文件中的数以矩阵 m*n*p的形式读入到内存中。
2 demo
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; void ReadSizeFile(const char *file_path, int size[4]) { FILE *file; file = fopen(file_path, "rt+"); if (!file) //条件不成立,则说明文件打开失败 { fclose(file); cout << "打开文件失败! " << endl; } fscanf(file, "Float32(%d, %d, %d, %d)", &size[0], &size[1], &size[2], &size[3]); fclose(file); } void ReadTDFfile(const char *file_path, vector<vector<vector<float>>>& object_TDF_data, int size[4]){ FILE *pFile; long lSize; char *buffer; size_t result; pFile = fopen(file_path, "rb"); if (pFile == NULL) { fputs("File error", stderr); exit(1); } // obtain file size: fseek(pFile, 0, SEEK_END); lSize = ftell(pFile); rewind(pFile); // 指针倒带至头 // allocate memory to contain the whole file: buffer = (char *)malloc(sizeof(char) * lSize); if (buffer == NULL) { fputs("Memory error", stderr); exit(2); } // copy the file into the buffer: result = fread(buffer, 1, lSize, pFile); if (result != lSize) { fputs("Reading error", stderr); exit(3); } float* f = (float*)buffer; /* the whole file is now loaded in the memory buffer. */ for(int i=0; i< size[0]; ++ i){ vector<vector<float>> column_row; for(int j=0; j< size[1]; ++ j){ vector<float> row; for(int k=0; k<size[2]; ++ k){ row.push_back(*f); ++ f; } column_row.push_back(row); row.clear(); } object_TDF_data.push_back(column_row); column_row.clear(); } // terminate fclose(pFile); free(buffer); } int main() { const char *file_path_size = "bicycle000002.size"; int size[4]; ReadSizeFile(file_path_size, size); vector<vector<vector<float>>> object_TDF_data; const char *file_path_data = "bicycle000002.raw"; ReadTDFfile(file_path_data, object_TDF_data, size); return 0; }
3 测试文件下载链接
我把相关project开源在了我的github上,欢迎下载。
https://github.com/2017Greg/myVscodeProject/tree/master
下载的时候请同时下载代码readTDF.cpp和测试文件 bicycle000002.size和bicycle000002.raw