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文件为例的更多相关文章

  1. 用 C# 读取二进制文件

    当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处 ...

  2. Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹

    1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...

  3. 信息管理代码分析<二>读取二进制文件数据

    first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...

  4. Android读取asserts和raw文件夹下的文件

    Android读取asserts和raw文件夹下的文件 经常需要用到读取“/res/raw”和"/asserts"文件夹下的文件,索性写成工具类方便以后使用. 一.raw文件夹下的 ...

  5. jdbc 读取oracle long raw 字段,里面存的是文本

    jdbc 读取oracle long raw 字段,里面存的是文本 参考: http://singlewolf.iteye.com/blog/278769 http://blog.csdn.net/r ...

  6. android无后缀二进制执行文件替代apk实现程序功能

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android无后缀二进制执行文件替代apk实现程序功能 实现将data/Android ...

  7. 将raw里面的数据库文件写入到data中

    package com.city.list.db; import java.io.File; import java.io.FileNotFoundException; import java.io. ...

  8. Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例

    1. 复制指定目录下指定后缀名的文件并修改名称的案例     需求:复制指定目录下的指定文件,并修改后缀名.  • 指定的文件是:.java文件.     • 指定的后缀名是:.jad     • 指 ...

  9. 使用Delphi读取网络上的文本文件,html文件

    使用Delphi读取网络上的txt和html文件 可以使用两种方法: 1.下载文件,然后进行读取 下载文件的Delphi代码可以参考: http://www.delphibbs.com/delphib ...

随机推荐

  1. Django之ModelForm操作

    一.ModelForm的使用 顾名思义,ModelForm就是将Model与Form进行绑定,Form有自动生成表单的作用,但是每一个forms字段需要自己手动填写,而Model就是数据库表包含了所有 ...

  2. HttpClient异常处理手册

    HttpClient异常处理手册 开源中国 发表于 2014-08-26 19:44:06 异常处理 HttpClient的使用者在执行HTPP方法(GET,PUT,DELETE等),可能遇到会两种主 ...

  3. 深入理解Magento - 第六章 - 高级Magento模型

    我们讲过Magento有两种模型,简单模型和EAV(Entity Attribute Value)模型.上一章我们讲过所有的Magento模型都是继承自Mage_Core_Model_Abstract ...

  4. Delphi 滚动条的使用

    DELPHI的滚动条默认发送消息格式: function TControl.Perform( Msg: Cardinal; WParam: WPARAM; LParam: LPARAM): LRESU ...

  5. BZOJ 1565: [NOI2009]植物大战僵尸(网络流+缩点)

    传送门 解题思路 最大权闭合子图.但是要注意一些细节,假如有一堆植物形成一个环,那么这些植物都是无敌的,并且他们保护的植物是无敌的,他们保护的保护的植物是无敌 的.所以要缩点,然后拓扑排序一次判无敌, ...

  6. hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

    子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...

  7. 服务器安装TeamViewer 13

    服务器安装TeamViewer 13 服务器上安装TeamViewer,网上找了个教程开始安装,里面有坑,安装时要根据自己的情况而定.Linux系统更新太快,网上教程可能会有一些出入. TeamVie ...

  8. 【开发者笔记】Linq 多表关联排序操作

    c# 一直是一门好用的语言,但是像linq这种骚操作实在是记不住.特此记下以备后用. var ls = from c in db.T_ProductReturnEntity join s in db. ...

  9. Javascript 面向对象之继承

    本文参考书籍<<Javascript高级程序设计>> js继承方式:实现继承,主要依靠原型链实现. 原型链:基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法. 这 ...

  10. [BOI2009]Radio Transmission 无线传输

    题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入输出格式 输入格式: 第一行给出字符串的长度,1 < L ≤ 1, ...