zhanghouxing的个人博客分享 http://blog.sciencenet.cn/u/zhanghouxing

博文

C读写二进制文件与文本文件

已有 15787 次阅读 2016-7-28 10:22 |个人分类:C 语言|系统分类:科研笔记|关键词:学者

(1) C语言读取二进制文件一般采用fread()和fwrite()函数,如果是ASCII格式,就没有必要这样读写了,基本可参考:http://blog.csdn.net/AresGod/article/details/1852321http://my.oschina.net/u/2404244/blog/715461http://c.biancheng.net/cpp/html/108.html

我这里参考这篇文章,写了个例子 (下面有两个main函数,主要为示意方便,实际运行中需要注释一个main函数),如下:

在读二进制文件时,需要知道数据类型(结构),否则读取的时候会出错。

fread函数原型:

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

size和count的含义:每次读count个块,每块为size字节

fread的返回值含义为:读到的块数,假定现在返回值为num(size太具有歧义,会让人以为是读到的字节数)

num值的判断:

1.num == count,读操作成功,返回count*size个字节;如果返回值与count不相同,则可能文件结尾或发生错误,比如有10个数据,每次读入3个数据,第四次读的时候,返回值=0,但是还有一个数据没有读,因此我们在实际的读写过程中,count一般设置为1,除非我们明确的知道有多少个数据。

2.num == 0,此时fread并不一定是读错了或到文件末尾了,fread函数返回值并没有判断这两种情况,以上两种情况只能用函数ferror和feof判断(返回值非零为正常)。

  当num为0时,也有可能只是读到的块数为0,不一定是文件末尾,那为什么会返回0呢?

   num = fread ( buf, 1024, 1, fp),看一下这个例子,假如你的文件大小不足1024字节,或是循环读文件,最后一次循环剩余的字节小于1024字节,这个时候fread就会返回0值,并且buf中没有数据,这就导致文件根本没有读过去或是没读够。


后面我又参考上面链接3写了一个例子,主要fseek函数和Rewind函数,rewind() 用来将位置指针移动到文件开头,前面已经多次使用过,它的原型为:

void rewind ( FILE *fp );fseek() 用来将位置指针移动到任意位置,它的原型为:int fseek ( FILE *fp, long offset, int origin );参数说明:
1) fp 为文件指针,也就是被移动的文件。

2) offset 为偏移量,也就是要移动的字节数。之所以为 long 类型,是希望移动的范围更大,能处理的文件更大。

3) origin 为起始位置,也就是从何处开始计算偏移量。C语言规定的起始位置有三种,分别为文件开头、当前位置和文件末尾,每个位置都用对应的常量来表示:


源代码下载:http://pan.baidu.com/s/1qXHogw8


(2)C语言读取文本文件,这里我举一个例子,就是我现在有两个文本文件,我想把两个文件合并,现在我们用两种方法实现。

第一种方法:将两个文件均打开,然后依次写入一个新文件:

代码如下,该程序调用方法:*.exe firstfile secondfile destiFile


这里需要说明的是,fgets函数第二个参数(bufsize)需要定义每行最大的字节数,如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。

第二种方法:将第一个文件加入到第二个文件开头(这种方法适合后面第二个文件比较大情况,如果第一个就比较大,可以在后面直接追加)


需要说明的是,在文件开始追加数据时,需要用用r+模式打开文件;在将程序的参数赋值给字符串时,有两种方法,一种是建立字符串指针,char *inputfile, 然后赋值,inputfile=argv[1];第二种是建立字符数组,char inputfile[255],然后赋值strcpy (inputfile,argv[1]),注意,不能用inputfile[255]=argv[1]来赋值。此外,printf (屏幕输出)和fprintf(文件输出)是有差别的,不要错了,我今天就写错了,让我找了半天才找到错误。

Addheader.rar




https://m.sciencenet.cn/blog-922140-993160.html

上一篇:儒略日与标准时间转换
下一篇:C语言与MATLAB对二进制文件与ASCII文件转换

0

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 17:39

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部