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. hdu 3450 后缀数组

    题目大意: 求多个字符串的最长公共子串 基本思路: 参加我的博客hdu2774 代码如下: #include<cstdio> #include<cstring> using n ...

  2. vue 本地环境API代理设置和解决跨域

    写一个config.js文件,作为项目地址的配置. //项目域名地址 const url = 'https://exaple.com'; let ROOT; //由于封装的axios请求中,会将ROO ...

  3. USACO18DEC Platinum

    standing out from the field 给你n个串,对于每个串求出只包含在这个串中的本质不同的子串? 后缀自动机,建树,对于每一个点打上包含在哪个串中的标记. 叶子都是前缀,直接在sa ...

  4. Hive学内置条件和字符串函数

    https://blog.csdn.net/skywalker_only/article/details/38752003 条件函数 下表为Hive支持的一些条件函数. 返回类型 函数名 描述 T i ...

  5. 深入理解Magento – 第十章、十一章(英文原版地址,仅供参考)

    深入理解Magento – 第十章 – Magento系统覆盖和升级 http://alanstorm.com/magento_upgrade_rewrite_override 深入理解MAGENTO ...

  6. Dart编程实例 - Final 关键字

    Dart编程实例 - Final 关键字 void main() { final val1 = 12; print(val1); } 本文转自:http://codingdict.com/articl ...

  7. [NOIP2016]天天爱跑步 题解(树上差分) (码长短跑的快)

    Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图 ...

  8. QtConcurrent::run() 的使用

    QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...

  9. DOS和DDOS攻击

    1.什么是DOS攻击 首先注意这里是DOS(Denial Of Service)攻击,并非DoS.DoS是微软早期的系统版本. DoS即Denial Of Service,拒绝服务的缩写.DoS是指故 ...

  10. caller.arguments.callee.eval

    ------------------------------------ 1.函数的调用方式,与this的指向问题,原型对象中的this 2.对象创建的几种方式! 3.str.replace 页面初始 ...