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[])
{
FILE *file;
file = fopen(file_path, "rt+");
if (!file) //条件不成立,则说明文件打开失败
{
fclose(file);
cout << "打开文件失败! " << endl;
}
fscanf(file, "Float32(%d, %d, %d, %d)", &size[], &size[], &size[], &size[]);
fclose(file);
}
void ReadTDFfile(const char *file_path, vector<vector<vector<float>>>& object_TDF_data, int size[]){
FILE *pFile;
long lSize;
char *buffer;
size_t result;
pFile = fopen(file_path, "rb");
if (pFile == NULL)
{
fputs("File error", stderr);
exit();
}
// obtain file size:
fseek(pFile, , 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();
}
// copy the file into the buffer:
result = fread(buffer, , lSize, pFile);
if (result != lSize)
{
fputs("Reading error", stderr);
exit();
} float* f = (float*)buffer;
/* the whole file is now loaded in the memory buffer. */
for(int i=; i< size[]; ++ i){
vector<vector<float>> column_row;
for(int j=; j< size[]; ++ j){
vector<float> row;
for(int k=; k<size[]; ++ 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[];
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 ;
}
3 测试文件下载链接
我把相关project开源在了我的github上,欢迎下载。
https://github.com/2017Greg/myVscodeProject/tree/master
下载的时候请同时下载代码readTDF.cpp和测试文件 bicycle000002.size和bicycle000002.raw
57 c++ 读取二进制文件: 以.raw后缀的TDF_Voxel_Size文件为例的更多相关文章
- 用 C# 读取二进制文件
当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处 ...
- Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹
1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...
- 信息管理代码分析<二>读取二进制文件数据
first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...
- Android读取asserts和raw文件夹下的文件
Android读取asserts和raw文件夹下的文件 经常需要用到读取“/res/raw”和"/asserts"文件夹下的文件,索性写成工具类方便以后使用. 一.raw文件夹下的 ...
- jdbc 读取oracle long raw 字段,里面存的是文本
jdbc 读取oracle long raw 字段,里面存的是文本 参考: http://singlewolf.iteye.com/blog/278769 http://blog.csdn.net/r ...
- android无后缀二进制执行文件替代apk实现程序功能
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha android无后缀二进制执行文件替代apk实现程序功能 实现将data/Android ...
- 将raw里面的数据库文件写入到data中
package com.city.list.db; import java.io.File; import java.io.FileNotFoundException; import java.io. ...
- Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例
1. 复制指定目录下指定后缀名的文件并修改名称的案例 需求:复制指定目录下的指定文件,并修改后缀名. • 指定的文件是:.java文件. • 指定的后缀名是:.jad • 指 ...
- 使用Delphi读取网络上的文本文件,html文件
使用Delphi读取网络上的txt和html文件 可以使用两种方法: 1.下载文件,然后进行读取 下载文件的Delphi代码可以参考: http://www.delphibbs.com/delphib ...
随机推荐
- appium1.4+华为8.0执行自动化脚本,报启动session失败,原因是unicode_ime_apk\Uni codeIME-debug.apk在手机上已存在,再次安装失败,导致启动session失败,解决办法:换高版本的appium
最开始做Android自动化测试时,通过执行脚本发现报,已安装UnicodeIME-debug.apk,再次安装失败,当时觉得这个apk对我来说没用,就把D:\Program Files (x86)\ ...
- eclipse 彻底修改复制后的项目名称
1.项目右键 --> properties --> Web Project Settings --> 修改Context root 2.web.xml 3.工作空间中找到当前项目下. ...
- vue 2.1.3 实时显示当前时间,每秒更新
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- jsp网站访问次数统计的几种方法
我采用的是jsp网页,但是不管采用什么语言,原理是一样的. 第一种,单页面统计.就是说,只要点击这个页面就会统计一次. <body> <%!//在这种标记中定义的变量为全局变量 in ...
- DOM学习总结(三)DOM访问/操作
DOM访问理解:找到这个标签元素,然后才能对它进行操作 1.getElementById() 方法document.getElementById(""); //通过id名字来找到 ...
- 随机生成一串字符串(java)
该随笔为开发笔记 今天在公司接手了一个项目,在看该项目老代码时,发现上一位大佬写的随机取一串字符串还不错,在此做一次开发笔记 在他的基础上我做了点改动,但是原理一样 /** * 随机取一段字符串方法1 ...
- Golang(Go语言)内置函数之copy用法
该函数主要是切片(slice)的拷贝,不支持数组 将第二个slice里的元素拷贝到第一个slice里,拷贝的长度为两个slice中长度较小的长度值 示例: s := []int{1,2,3} fmt. ...
- C++之手写strlen函数
代码: int strlen(const char *str){ assert(str!=NULL); intlen=; while((*str++)!='\0') len++; return len ...
- linux中export的作用
设置环境变量. 为什么设置环境变量?---->全局使用. 不设置环境变量会怎么样?->只有当前shell中能够调用,其他的shell不能调用. 设置了之后呢?->全局都能调用.
- JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...