C语言中把结构内容写入二进制文件及从二进制文件中读取出数据

#include <stdio.h>

#include <stdlib.h>

#define MAXTITL 40

#define MAXAUTL 40

#define MAXBKS 3 // 最多存储3本书

struct book{

char title[MAXTITL];

char author[MAXAUTL];

float value;

};

int main(void){

struct book library[MAXBKS];// 结构数组

int count = 0;

int index,filecount;// filecount用来保存已读结构的数目

FILE* pbooks;

int size =sizeof(struct book);// 一个book结构体变量所占用内存的字节数

if((pbooks = fopen("book.dat","a+b")) == NULL){// 打开二进制文件book.dat失败

fputs("Can't open book.dat file\n",stderr);

exit(1);

}

rewind(pbooks);// 定位到文件开始处,为开始读取做好准备

while(count < MAXBKS && fread(&library[count],size,1,pbooks) == 1){// 读取字段成功(每次循环把一个结构读到结构数组中,当数组满或文件读完时停止)

if(count == 0){

puts("Current contents of books.dat:\n");

}

printf("%s by %s:$%.2f\n",library[count].title,library[count].author,library[count].value);// 打印出文件中已经有的book数据

count++;

}

filecount = count;// 文件中结构体的数量保存到filecount

if(filecount == MAXBKS){// 如果文件中已经有了3个book结构体,则不允许用户再输入新的book结构体

fputs("The book.dat file is full\n",stderr);

exit(2);

}

// 初始化新的book结构体


while(count < MAXBKS){

printf("now the count is %d\n",count);

puts("please add new book titles\n");

gets(library[count].title);

if(library[count].title != NULL && library[count].title[0] !='\0'){// 如果用户输入的新的book结构体的title有内容

puts("now enter the author\n");

gets(library[count].author);

if(library[count].author != NULL && library[count].author[0] !='\0'){// 如果用户输入的新的book结构体的author有内容

puts("now enter the value\n");

scanf("%f",&library[count].value);

if(count < MAXBKS){

puts("enter the next title\n");

count++;

}

}

}

}

if(count > 0){

puts("here is the list of your books:\n");

for (index = 0;index < count;index++){// 看一看自己初始化的结构体对不对

printf("%s by %s:$%.2f\n",library[index].title,library[index].author,library[index].value);

}

fwrite(&library[filecount],size,count - filecount,pbooks);// 把数据写入到文件的末尾

}else{

puts("no books? too bad\n");

}

puts("bye bye\n");

fclose(pbooks);

return 0;

}

程序第一次运行,需要用户手动依此输入三本书的title、author、value信息

程序第一次运行结束后,可以在项目下面看到新产生的book.dat文件,及book.dat文件中存储的自己输入的三本书的数据

再次运行程序,即可读取出二进制文件中的数据,并在控制台中看到第一次执行程序存入到文件中的数据

选择二进制模式是因为fread和fwrite要使用二进制文件。结构中有些内容是文本,但是像value数据却不是文本。所以如果用文本模式查看book.dat,那么文本部分会正确显示,但是数字部分不可读,甚至还可能导致文本编辑器显示乱码


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值