可以这么说,除了文本文件以外的所有文件都是二进制文件。二进制文件相对于文本文件更容易修改。因为文本文件的修改,需要修改以后写入内存,然后再清空原文件,再从内存中读取出修改以后的内容到本文件中。二进制文件修改只需要找到特定的字符,然后对它进行修改。

对二进制文件进行操作主要用到fopen,fread,fwrite,fseek等函数。

完整代码:

#include

#include

#include

struct stu

{

int id;

char name[10];

int age;

}; //定义一个学生结构体

struct stu s1;

void read_file(char *filename)

{

FILE *fd = fopen(filename,"rb");

if(fd == NULL)

{

perror("open failed!");

exit(1); //出错、退出

}

fread(&s1,sizeof(s1),1,fd);

printf("%d %d %s\n",s1.id,s1.age,s1.name);

fclose(fd);

}

//写入文件

void write_file(char *filename)

{

FILE *fd = fopen(filename,"wb");

s1.id=77;

s1.age=17;

strcpy(s1.name,"yang");

if(fd == NULL)

{

perror("open failed!");

exit(1);

}

fwrite(&s1,sizeof(s1),1,fd);

fclose(fd);

}

//修改文件

void modify(char *filename)

{

FILE *fd = fopen(filename,"rb+");

if(fd == NULL)

{

perror("open failed!");

exit(1);

}

while(1)

{

int res = fread(&s1,sizeof(s1),1,fd);

if(res <= 0)

{

break;

}

if(s1.id == 77) //通过查找id=77的位置来修改该结构体成员

{

s1.age=22;

strcpy(s1.name,"yangni");

fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量

fwrite(&s1,sizeof(s1),1,fd);

break;

}

}

}

int main()

{

write_file("test.txt");

read_file("test.txt");

modify("test.txt");

printf("%d %d %s\n",s1.id,s1.age,s1.name);

read_file("test.txt");

return 0;

}

主要函数:

1、fopen()

FILE * fopen(const char * path, const char * mode);

FILE *fd = fopen(filename,"rb");

if(fd == NULL)

{

perror("open failed!");

exit(1); //出错、退出

}

path字符串包含欲打开的文件路径及文件名

参数 mode 表示文件打开方式

参数mode:

字符串

说明

r

以只读方式打开,且文件必须存在

r+

以读/写方式打开文件,该文件必须存在

rb+

以读/写方式打开一个二进制文件,只允许读/写数据

rt+

以读/写方式打开一个文本文件,允许读和写

w

打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件

w+

打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a

以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)

a+

以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)

wb

以只写方式打开或新建一个二进制文件,只允许写数据

wb+

以读/写方式打开或建立一个二进制文件,允许读和写

ab+

以读/写方式打开一个文本文件,允许读或在文本末追加数据

2、fread()

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

返回值:返回实际写入的数据块数目

从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0

buffer 用于接收数据的内存地址

size 要读的每个数据项的字节数,单位是字节

count 要读count个数据项,每个数据项size个字节.

stream 输入流

3、fwrite()

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

注意:这个函数以二进制形式对文件进行操作,不局限于文本文件

返回值:返回实际写入的数据块数目

(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;

(2)size:要写入内容的单字节数;

(3)count:要进行写入size字节的数据项的个数;

(4)stream:目标文件指针;

(5)返回实际写入的数据项个数count。

4、fseek()

int fseek(FILE *stream, long offset, int fromwhere);

函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

(1)stream:文件指针

(2) offset:为偏移量,正数表示正向偏移,负数表示负向偏移

(3) fromwhere:从文件的哪里开始偏移,可能取值为:SEEK_SET,SEEK_CUR、 SEEK_END (对应0 、 1 、 2)

fseek(fp,100L,0); 把stream指针移动到离文件开头100字节处;

fseek(fp,100L,1); 把stream指针移动到离文件当前位置100字节处;

fseek(fp,-100L,2); 把stream指针退回到离文件结尾100字节处。

关于fseek上文代码分析:

if(s1.id == 77) //通过查找id=77的位置来修改该结构体成员

{

s1.age=22;

strcpy(s1.name,"yangni");

fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量

fwrite(&s1,sizeof(s1),1,fd);

break;

}

通过查找s1.id获得s1对象,此时光标锁定到了该对象数据末尾,因此修改完数据后。可设置向左偏移该结构体长度,将光标偏移到该结构体之前,再写入数据就可以覆盖之前的s1,就把s1内容给更改了。

c语言读一字节程序,C语言读写二进制文件相关推荐

  1. c 语言含移位的程序,c语言的移位练习题目.doc

    c语言的移位练习题目 精品文档2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE21 / NUMPAGES21 c语言的移位练习题目 1.系统的标准输入文件是指_________. ...

  2. c语言课程设计加密程序,C语言课程设计文件加密解密.doc

    C语言课程设计文件加密解密 C语言程序设计 课程设计 学 院 计算机工程 班 级 计算1313 姓 名 学 号 201321121089 成 绩 指导老师 2014年6月26日 计算1313班C语言程 ...

  3. python是语言还是软件_程序开发语言之Python:是追逐还是坚守?

    Python作为计算机程序设计语言的其中一种,最初是被设计用于编写自动化脚本(shell),随着版本的不断更新.语言新功能的添加和机器学习的兴起,Python从2017年开始受到广泛关注. Pytho ...

  4. c语言经典解决实际程序,C语言经典教程1讲.ppt

    <C语言经典教程1讲.ppt>由会员分享,可在线阅读,更多相关<C语言经典教程1讲.ppt(48页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:任祖华,2,本课程学 ...

  5. c语言怎么返回前一个程序,c语言return返回到哪

    c语言return返回到哪 c语言return,返回给了上一级,比如一个递归程序,从第三层返回到第二层:又比如一个普通的子程序,那就返回到主程序中去. 主程序中return返回给了操作系统. 比如下面 ...

  6. 用c语言做一个五子棋程序,C语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

  7. c语言读renix文件程序,启动文件hekate如何修改才能够加载debug模式并进入renix

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.nsdebugger.kip放到以下两个路径下 /modules/required /ReiNX/sysmodules 2.NSwitchDebugg ...

  8. c语言常考的程序,C语言 一些常考得东西

    C语言基础测试 1.#include "heima.txt" 表示文件在哪个目录?( D) A.系统根目路径 B.编译器路径 C.桌面 D.与当前文件目录一致. 2.C源程序中不能 ...

  9. C语言第一个字节地址,C语言字节对齐详解

    #pragma pack () /*取消指定对齐,恢复缺省对齐*/本文引用地址:http://www.eepw.com.cn/article/148849.htm sizeof(struct D)值为 ...

  10. c语言指针地址交换程序,C语言-基础教程-指针的地址分配

    我们可以定义指针变量指向任何类型的变量.在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现.指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得 ...

最新文章

  1. 一百万个视频短片数据集来啦!看看有没有你见过的瞬间(附视频)
  2. 2015年度互联网安全报告发布 移动支付成重灾区
  3. 日本社交巨头Line推出BCH交易服务,助力比特币现金蓬勃发展
  4. Linux系统简介 、 安装Linux系统 、 RHEL6基本操作
  5. python apktool_【转】利用apktool反编译apk,并且重新签名打包
  6. sqlplus操作--文件的输入与输出
  7. SynchronizationContext
  8. Hibernate懒加载问题
  9. LeetCode228场周赛解题报告
  10. 剧情反转:今年AI要凉!薪资碾压全行,但人才缺500万!
  11. hadoop conf中xml文件修改
  12. android xutil 数据库,Android XUtils3框架的基本使用方法(二)
  13. C# DataSet转ListDataTable
  14. 关于三层交换机的智能流技术
  15. mysql根据外键多条件查询_MySQL练习-主外键多表查询
  16. Vue学习笔记(六)
  17. Java ClassLoader基础及加载不同依赖 Jar 中的公共类
  18. 计算机辅助几何设计知识点,计算机辅助几何设计
  19. web端四方支付 只有安卓可以跳转
  20. 记录一下weui文档地址

热门文章

  1. Linux下Python的安装以及注意事项
  2. Django中应用celery
  3. Javascript基础知识笔记四
  4. axios get和post请求带参数和headers配置
  5. PHP报错:iconv(): Detected an illegal character in input string
  6. XML内容要有根标签:Extra content at the end of the document
  7. PHP树形结构数据处理成面包屑结构
  8. CSS从大图片上截取小图标的使用
  9. Failed to register native method nativeSetStatusCallback in base.apk
  10. dontshrink解决ProGuard错误:java.lang.StackOverflowError