使用FILE结构操作二进制文件(文件实训)

编写一个从二进制文件中读取服装信息的函数。

相关知识

打开文件

要以二进制的方式操作文件,需要首先以二进制的方式打开文件。以二进制方式打开文件只需要在打开方式中增加字符 b 即可。
例如:

FILE *fp = fopen("a.dat", "rb");

以上代码中文件的打开方式为 rb ,字符 r 表示打开的文件用于读,字符 b 表示以二进制的方式打开。

读写文件

打开文件后依然是文件读写。二进制文件的可以使用 fread 和 fwrite 函数。

fwrite 函数

函数 fwrite 的原型为:

size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
  1. size_t 为类型 long 的别名。函数 fwrite 实现把内存中从指定位置开始的指定个数的字节以二进制的方式写入文件。
  2. 第一个参数 buffer 指向内存中要写入文件的数据的首地址。
  3. 第二个参数 size 是要写入文件的数据对象的大小,一般使用运算符
    sizeof 计算数据对象所占空间的字节数。
  4. 第三个参数是要写入的数据对象的个数。
  5. 第四个参数是文件指针,指向要写入数据的文件。函数fwrite 可以一次将从 buffer 开始的,size*count 个字节的数据写入指针 stream 指向的文件中。

例如下面的程序可以将一个整数以二进制方式写入文件:

int n = 100;
FILE *fp = fopen("a.dat","wb");     // 打开二进制文件 a.dat 用于写
fwrite(&n,sizeof(n),1,fp);     // 将 n 以二进制形式写入文件
fread 函数

函数 fread 的原型为:

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
  1. 与 fwrite 相反,函数 fread 的作用是从文件的当前位置读取指定字节数的数据放入到内存的指定位置。
  2. 第一个参数 buffer指向内存中要写入数据的位置。
  3. 函数 fread 的后 3 个参数与函数 fwrite 的后 3个参数的意义相同,给出了要读取数据对象的字节数、数目及被读取的文件。
  4. 函数 fread 可以从指定文件的当前位置一次性读取size*count 个字节的数据并存入 buffer 中。

例如下面的程序可以将文件 fp 中当前位置的整数以二进制方式读出到变量 n 中:

int n;
FILE *fp = fopen("a.dat","wb");     // 打开二进制文件 a.dat 用于写
fread(&n,sizeof(n),1,fp);

此外,二进制文件的读写实际上是把数据原封不动的从文件搬到内存,或者从内存搬到文件。这里的原封不动是指数据的存储形式,即数据在内存中的0|1形式。
而文本文件的读写则不是,需要做一些转换。
例如把内存中的整数12以文本方式写入文件,12的存储格式为00000000 00000000 00000000 00001100,程序需要把这个数据转换成字符串"12"写入文件。

关闭文件

关闭文件函数和文本文件的关闭函数的使用事一样的,都是 fclose 函数。

//test.cpp
#include <stdio.h>
//声明结构clothing
struct clothing 
{
 char label[12]; //编号
 float price;    //价格
};
//声明外部函数,函数readClothing在其它源文件中实现
extern int readClothing(FILE *fp, clothing cloth[]);
int main()
{
 clothing t;
 int n,i;
 //输入服装信息,存入文件a.dat
 FILE *fp = fopen("a.dat","wb");  //打开二进制文件a.dat用于写
 scanf("%d",&n); //输入服装种数
 fwrite(&n,sizeof(n),1,fp); //将n以二进制形式写入文件
 for(i=0;i<n;i++)
 {
  scanf("%s %f",t.label,&t.price); //输入一种服装的编号和价格
  fwrite(&t,sizeof(t),1,fp); //将该服装信息以二进制形式写入文件
 }
 fclose(fp); //关闭文件
 //定义服装信息数组
 clothing cloth[100];
 //打开文件,以二进制方式打开用于读
 fp = fopen("a.dat", "rb");
 //从文件中读取服装信息到数组cloth中
 n = readClothing(fp, cloth);
 //关闭文件
 fclose(fp);
 //输出服装信息
 for(i=0;i<n;i++)
 {
  printf("%s %d\n",cloth[i].label,(int)cloth[i].price);
 }
 return 0;
}
//fileBin.cpp
#include <stdio.h>
// 结构clothing
struct clothing 
{
    char label[12];  // 编号
    float price;  // 价格
};
/* 
   函数readClothing:从文件fp中读取服装信息到cloth中
   参数fp:指向打开的二进制文件,cloth:存放读出的服装信息
   返回值:服装信息数量
   说明:文件中首先以二进制方式存入了一个整数(服装信息数n),然后以二进制方式存入n种服装信息(clothing类型)
*/
int readClothing(FILE *fp, clothing cloth[])
{
    int n;
    // 读一个整数(服装信息数)
    fread(&n,sizeof(n),1,fp);
    // 读出n种服装信息到cloth中
    fread(cloth,sizeof(clothing),n,fp);
    return n;\
}
原创文章 291 获赞 256 访问量 2万+

猜你喜欢

转载自blog.csdn.net/huangziguang/article/details/105853179