Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作
来源:互联网 发布:69天宫怎么加点知乎 编辑:程序博客网 时间:2024/05/01 18:08
一、前言
在做一个镜头的初始化操作,需要加载一个648*522像素大小的文件,厂商提供的是一个excel表,如果要加载数据,可用加载txt文本的方式,我选用二进制方式加载文件;大家都知道电脑真正执行的不是高级语言,而是0和1的二进制文件,而且不管你是几维的数据,存放计算机内存上的数据是一维,而且按一定顺序执行下来(虽然操作系统原理介绍到在宏观上有并行处理,但微观上还是串行执行的)。所以直接加载二进制文件效率是最高的,摒弃了数据转换所涉及的一个资源开销,有时候还会有精度损失。
二、操作二进制文件相关的函数
操作二进制的相关函数,引用标准库头文件#include <stdio.h>
/* * @fopen 该函数打开一个特定的文件,并返回一个流于该文件进行关联; * @param name:打开文件或者一个设备的名称; * mode:提示打开文件的方式; * ①文本文件: 读取:“r”,写入“w”,添加“a”; * ②二进制文件:读取:“rb”,写入“wb”,添加“ab”; * 读取mode:要求所打开的文件一定要存在; * 写入mode:当打开的文件不存在,程序会新建一个文件;但打开的文 * 件存在,会删除原始内容重新写入数据; * 添加mode:当打开的文件不存在,程序会新建一个文件;但打开的文 * 件存在,在原始内容上继续添加内容; * @return fopen函数的返回FILe*类型,成功返回非NULL */FILE* fopen(char const *name, char const *mode);/* * @fclose 关闭流函数; * @param fp:所要关闭的流; * @return fclose在文件关闭之前刷新缓冲区,成功执行返回零值,失败返回EOF; */int fclose(FILE* fp)
/* * @fread 二进制文件读取函数 * @param buffer:读取的数据所存放内存位置的指针; * size: 缓冲区每个元素的Byte数,可用sizeof(类型)判断; * count: 读取数据的元素个数; * stream:要读取的数据流 * @return fread返回实际读取元素的数目(非字节数,由读取每个元素的类型决定) */size_t fread(void *buffer, size_t size, size_t count, FILE* stream);
三、程序测试
1、数据源的获取
excel的数据源如下图,从红色标示可以看出数据庞大,30多万的数据:
把excel的数据导成txt文件;
再把txt文件用工具转换成二进制文件;
2、测试main函数
#include <stdio.h>//#include <stdlib.h>//用linux环境的gcc4.6.2编译,没有此头文件在分配动态内存时会警告malloc与free不兼容的问题#define COL 522//数据的列#define ROW 648//数据的行int main(int argc, int *argv[]){ FILE * fp = NULL;//定义先赋值为NULL unsigned char *buf; int ret, i= 1; //分配动态内存保存读取二进制文件的数据,因为每个点的值在0~255之间(0~1111 1111),用8位bit的char型即可; buf = (unsigned char *)malloc(ROW*COL*sizeof(char)); //打开二进制文件,选取相应的模式,我的STD6DDAC.BIN二进制文件放在LINUX系统的/opt/目录下; fp = fopen("/opt/STD6DDAC.BIN", "rb"); if( NULL == fp ){ return (-1); } //读取文件,并返回所读取char型数据元素的个数; ret = fread(buf, sizeof(unsigned char), ROW*COL, fp); if(ret < 0){ printf("read data error!\n"); } printf("The value of ret is:%d\n", ret); //读取前100个数据,可以打印上面数据源的100个数据 printf("Read the first 100 data______\n"); for(i = 0;i < 100;i++){ printf("%d\t", buf[i]); if((i+1)%10 == 0){ printf("\n"); } } //判断数据是否完整,读取后100个数据基础上并多读2个数据; printf("Read more than two data more than last 100 data___\n"); for(i = ROW*COL-100;i < ROW*COL+2;i++){ printf("%d\t", buf[i]); if((i+1)%10 == 0){ printf("\n"); } } printf("\n"); fclose(fp);//关闭文件,避免内存泄露或下次访问出错; fp = NULL;//文件指针指向空,避免出现游离指针; free(buf);//释放所开辟的动态内存; return 0;}
3、测试结果
可以看到读取的数据元素个数为:338256 = 648*522;所以在打开文件或者读取数据之后,千万千万一定一定要加判断,可以查看程序是否操作成功,为调试代码提供不了不少方便;而且前面前面的数据与上面excel中数据源完全匹配(由excel数据太多,右端的部分数据显示不出来),而读取超出338256个数据之后的2个数据,完全是0,可以判断读取二进制文件的数据时成功的。fwrite()函数就不用细说了,原理跟fread()类似,只是一个是写入,一个是读取;
0 0
- Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作
- C语言进行二进制文件的读写操作(fopen,fwrite,fread)
- linux c语言之文件操作相关函数--fopen(),fopen_s(),fread(),fwrite(),fclose(),
- [小结]C语言的文件操作函数fopen,fread,fwrite注意点
- c 函数fopen,fwrite,fread
- c 函数fopen,fwrite,fread
- C语言:文件函数 fopen(),fclose(),fwrite(),fread()
- fgetc()/fputc()/fgets()/fputs()/fread()/fwrite()/fopen()/fclose() 等C语言文件操作函数
- C语言fwrite()函数和fread()函数
- fopen函数和fread函数、fwrite函数
- fopen函数和fread函数、fwrite函数
- fopen函数和fread函数、fwrite函数
- fopen函数和fread函数、fwrite函数
- C语言读写文件 -fopen、fread、fwrite
- c语言中的 fopen fseek fread fwrite
- C语言的二进制IO函数fread()和fwrite()
- fopen()、fwrite()、fread()函数
- c 函数fopen,fwrite,fread,fgets,fputs
- java transient简介
- xhtml2pdf如何支持中文
- HTML DOM
- offsetParent
- java中synchronized和lock的区别
- Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作
- L1-008. 求整数段和
- 华为oj初级 求解立方根
- Can't find the name of Intel ICD OpenGL driver
- 通过adb命令 查看当前跳转到那个activity
- CMake broken --is not able to compile a simple test program
- java 泛型思想及其应用
- mysql,mongodb导出数据库的某几列到CSV文件
- TCP/IP、Http的区别