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. 【leetcode】951. Flip Equivalent Binary Trees

    题目如下: For a binary tree T, we can define a flip operation as follows: choose any node, and swap the ...

  2. 操作系统之IO管理

    IO系统结构 设备的分类 按数据组织分 块设备: 信息的存取总是以数据块为单位. 它属于有结构设备,如磁盘等. 磁盘设备的基本特征是传输速率较高,以及可寻址,即对它可随机地读/写任一块. 字符设备: ...

  3. 【LeetCode 19】删除链表的倒数第N个节点

    题目链接 [题解] 经典的一道题. 让p1指向链表的第一个元素. 让p2指向链表的第二个元素. 然后让他们俩同时往后移动. 直到p2到达链表的尾巴. 这时p1和p2之间总是隔了n-1个元素. 所以p1 ...

  4. 二分+贪心——cf1251D

    二分的时候要特别注意一下下界L #include<bits/stdc++.h> using namespace std; #define ll long long #define N 20 ...

  5. Html加水印和禁用复制和右键(jquery.watermark.js)

    近期遇到一个需求,需要在页面背景加上自己的水印和禁止用户在页面复制粘贴 解决: 水印使用的是jquery.watermark.js插件,这个插件可以在html背景上加水印,同时可以设置相关属性值. 相 ...

  6. JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)

    CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...

  7. (转)OpenFire源码学习之四:openfire的启动流程

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...

  8. I/O复用 poll简介

    1.基本概念 poll起源于SVR3,开始时局限于流设备,在SVR4时取消了此限制,允许poll工作在任何描述符上,但涉及到流设备时,它还提供了附加信息. poll的机制与select类似,与sele ...

  9. Airbnb React/JSX 编码规范

    Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...

  10. Ethenet: MAC PHY MII RMII

    https://www.cnblogs.com/liangxiaofeng/p/3874866.html 1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器 ...