关闭

Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作

标签: 二进制c语言
686人阅读 评论(0) 收藏 举报
分类:

一、前言

在做一个镜头的初始化操作,需要加载一个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文件
再把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
查看评论

一个极度简单的写Excel文件实现

在网上看见一个C#写Excel的实现,我改成C++了,希望能对大家有所帮助。 #include #include typedef unsigned short ushort; class ExcelWriter { private: FILE *pf; void Writ...
  • lgao622
  • lgao622
  • 2015-08-14 17:07
  • 1394

C语言操作EXCEL文件(读写)

本文主要介绍通过C语言操作EXCEL文件(读写)。
  • hongzhen91
  • hongzhen91
  • 2017-02-26 18:18
  • 16897

linux fopen fread fwrite函数分析

1、fopen FILE * fopen(const char * path,const char * mode); 参数path字符串包含欲打开的文件路径及文件名, 参数mode字符串则代表着流形态。mode有下列几种形态字符串:   r  打开只读文件,该文件必须存...
  • pingnanlee
  • pingnanlee
  • 2013-07-31 18:29
  • 20230

fopen()、fwrite()、fread()函数使用说明与示例

fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。 2.函数原型: FILE * fopen(const char * path,const char * mode); -- path: 文件路径,如:"F:\Visual ...
  • yang2011079080010
  • yang2011079080010
  • 2016-09-13 18:21
  • 35666

fopen的一个实现(ZT)

open和fopen的区别:前者属于低级IO,后者是高级IO。前者返回一个文件描述符,后者返回一个文件指针。前者无缓冲,后者有缓冲。前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。后者是在前者的基础上扩充而来的,在大多数情况下,用后者。==========...
  • wishfly
  • wishfly
  • 2005-11-20 10:43
  • 2074

Excel文件操作类

using System;using System.Data;using System.Data.OleDb;using System.Text;using System.IO;namespace Hxh.API{ ///  /// ExcelOpration 的摘要说明。...
  • songkexin
  • songkexin
  • 2007-12-16 09:23
  • 733

关于二进制文件fread、fwrite函数使用读写

环境:vs2013 语言:C语言 时间:2015年3月10日 #define _CRT_SECURE_NO_WARNINGS #include #include #define FILENAME "d:/studentInfo" #define COUNT 5 typede...
  • Mingyueruya
  • Mingyueruya
  • 2015-03-10 22:05
  • 2171

(四)Linux下c语言用fread()和fwrite()实现文件复制

1.fput/fget按字符读取函数  : 可以读取文本文件和二进制文件,但是读单个字符效率比较低。 2.fgets/fputs按行读取函数:只能处理文本文件,不能二进制文件,因为二进制包含0,0是终止符所以不能读。 3.fread/fwrite按对象结构体读取:都可以读/所以推荐这种用法...
  • u013488347
  • u013488347
  • 2017-08-01 14:55
  • 376

C++ ofstream和ifstream详细用法 及文件操作 导入到EXCEL

[导读]      ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间     在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O.   &#...
  • zdhlwt2008
  • zdhlwt2008
  • 2015-07-06 15:02
  • 3052

fopen小记

整理自https://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx errno, _doserrno, _sys_errlist, and _sys_nerr   这些全局变量包含perror和strerror函数使用的...
  • Axing1991
  • Axing1991
  • 2017-05-16 10:07
  • 235
    个人资料
    • 访问:14731次
    • 积分:251
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:10条
    最新评论