一、前言


  • 在前面一篇文章中我们介绍的函数以一次一个字符或一次一行的方式进行操作。如果进行二进制I/O操作,那么我们更愿意一次读活蟹一个完整的结构。如果使用getc()或putc()读、写一个结构,那么必须循环通过整个结构,每次循环处理一个字节,一次读或写一个字节,这会非常的麻烦。如果使用fputs()或fgets(),那么因为fputs()在遇到null字节时就停止,而在结构中可能含有null字节,所以不能使用它实现读结构的要求;类似的,fgets()遇到null也会停止工作
  • 因此提供了下面两个函数以张艺兴二进制I/O操作

二、fread()、fwrite()


fread() 

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


  • 功能:从stream流中读取count次数据,每次读取size个字节大小。然后写入到buffer中
  • 返回值:

  • 读取成功:返回实际读取stream流的次数,而不是字节数
  • 读取失败/达到文件尾:返回0

  • 若stream或buffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errno为EINVAL以及返回0



fwrite() 

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


  • 功能:从buffer中读取count次,每次读取size个字节,然后写入到stream流中
  • 返回值:
  • 读取成功:返回实际写入stream流的次数,而不是字节数


//将一个结构体信息写入到文件中,然后再文件中读出来
#include<stdio.h>
#include<string.h>
typedef struct student
{
int age;
char name[20];
}stu;
int main()
{
stu Man={17,"xiaoming"};
stu Man2;
FILE *pf;
if(pf=fopen("Demo.txt","w+"))
{
fwrite(&Man,sizeof(stu),1,pf);
}
fclose(pf);
if(pf=fopen("Demo.txt","r"))
{
fread(&Man2,sizeof(stu),1,pf);
printf("Age:%d,Name:%s\n",Man2.age,Man2.name);
fclose(pf);
}
return 0;
}