结构体和文件的共同操作的一个小例子

#include<stdio.h>
#include<stdlib.h>
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS  10
struct book{
	char title[MAXTITL];
	char author[MAXAUTL];
	float value;
};

int main(void)
{
	struct book library[MAXBKS];
	FILE *fp;
	int count=0;
	int index;
	int filecount;
	char ch_juge;
	int size=sizeof(struct book);
	
	if((fp=fopen("c:\\book.dat","a+b"))==NULL)//open the book.dat
	{
		printf("Can't open the book.dat\n");
		exit(1);
	}

	rewind(fp);//make sure the pointer of the file is at the start

	while(count<MAXBKS && fread(&library[count],size,1,fp)==1)//read the contents of the file to the buffer
	{
		if(count==0)
			printf("Current contents of book.dat:\n");
		printf("%s by %s :$ %.2f\n",library[count].title,library[count].author,library[count].value);
		count++;
	}
	filecount=count;//filecount records the end of the original file data 
	if(count==MAXBKS)
	{
		printf("The book.dat file is full.\n");
		exit(2);
	}
	
	printf("Do you want to add new books?(press y to add and others mean no.)\n");
	if((ch_juge=getchar())!='y')
		exit(3); 

	printf("Now add new book title.(Press [enter] at the start of a line to stop.)\n");
	
	while(getchar()!='\n')
			continue;

	while(count<MAXBKS && gets(library[count].title)!=NULL && library[count].title[0]!='\0')// these lines are very important and classical
	{
		puts("Now enter the author.");
		gets(library[count].author);
		puts("Now enter the value.");
		scanf("%f",&library[count].value);
		count++;
		while(getchar()!='\n')
			continue;
		if(count<MAXBKS)
			printf("Enter the next book!\n");
	}

	if(count>0)      //display the list of the books
	{
		puts("Here is the list of the 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,fp);//write and save to the book.dat
	}
	else
		puts("No books? Too bad.\n");
	
	
	puts("Bye.\n");
	fclose(fp);//do not forget to close the pointer of the file

	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值