#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;//定義文件指針fp,指向文件的起始地址
struct bbb
{
char name[10];
char writer[10];
char num[12];
char addr[8];
char time [8];
char price[8];
}book;
int main()
{
int t,i=1;
char menu();//菜單
void list();//顯示
void input();//輸入
void search1();//按書名查詢
void search2();//按作者名查詢
void modify();//修改
void del();//刪除
printf("請輸入登錄號(1):\n");//登錄號爲1;
scanf("%d",&t);
if(t==1)
{
while(1)
{
switch(menu())
{
case '0':t=1;break;
case '1':input();break;
case '2':list();break;
case '3':search1();break;//bookname search
case '4':search2();break;//writer search
case '5':modify();break;
case '6':del();break;
case '7':exit(0);break;
default :break;
}
}
}
else printf("登錄名錯誤!請重新輸入:\n");main();//exit(1);
return 0;
}
char menu()//顯示菜單界面並
{
char n;
system("cls");
system ("color 1D");
printf("\t\t****************歡迎使用圖書管理系統**************\n");
printf("\t\t* 丨 1.輸入圖書信息 丨*\n");
printf("\t\t* 丨 2.顯示圖書信息 丨*\n");
printf("\t\t* 丨 3.按書名查找圖書信息 丨*\n");
printf("\t\t* 丨 4.按作者查找圖書信息 丨*\n");
printf("\t\t* 丨 5.修改圖書信息 丨*\n");
printf("\t\t* 丨 6.刪除圖書記錄 丨*\n");
printf("\t\t* 丨 7.退出圖書管理系統 丨*\n");
printf("\t\t************************************************\n");
printf(" 請選擇菜單命令: ");
while(1)
{
do
{
fflush(stdin);//清除緩存
printf("\n輸入菜單(1--7):");
scanf("%c",&n);
} while(n <'0' || n >'8'); //不滿足條件繼續重新輸入,滿足條件跳出循環結構程序流程向下
return n;//返回值返回給主函數,用以選擇功能模塊
}
}
void input()//錄入
{
char ch;
fp = fopen("book.txt","ab");//以追加方式打開文件,如果文件不存在則建立該文件
do
{
fflush(stdin);
printf("請輸入書名:");
scanf("%s",book.name);
printf("請輸入作者:");
scanf("%s",book.writer);
printf("請輸入圖書編號:");
scanf("%s",book.num);
printf("請輸入出版社:");
scanf("%s",book.addr);
printf("請輸入出版時間:");
scanf("%s",book.time);
printf("請輸入價格:");
scanf("%s",book.price);
printf("---------------------------------------------------------");
getchar();
fwrite(&book,sizeof(book),1,fp);
printf("\n是否繼續輸入新的圖書信息?\n");
printf("請選擇(Y/N):");
ch=getchar();
}while(ch == 'y' || ch == 'Y');
getchar();
printf("是否返回主菜單?按回車鍵返回");
getchar();
fclose(fp);//關閉文件防止數據丟失
}
void list()//顯示
{
fp = fopen("book.txt","r");//以只讀方式(r)
printf(" 書名 作者 分類號 出版單位 時間 價格\n");
while(fread(&book,sizeof(book),1,fp) == 1)
{
printf("%10s%8s",book.name,book.writer);
printf("%10s%8s%12s%10s\n",book.num,book.addr,book.time,book.price );
}
getchar();
printf("按回車鍵返回主菜單!");
getchar();//等待用戶查看命令,按回車鍵返回
fclose(fp);//關閉文件
}
void search1()//bookname search
{
char name[10];
printf("請輸入要查找的書名:");
fflush(stdin);//清除緩存
gets(name);
fp = fopen("book.txt","rb");//以二進制只讀方式打開文件
while(!feof(fp))//判斷文件是否到達末尾
{
fread(&book,sizeof(book),1,fp);
if(strcmp(name,book.name) == 0)
{
printf("已找到目標圖書:\n");
printf(" 書名 作者 分類號 出版單位 時間 價格\n");
printf("%10s%10s ",book.name,book.writer);
printf("%10s%8s%10s%10s\n ",book.num,book.addr,book.time,book.price );
printf("\n按回車鍵返回主菜單\n");
getchar();//等待用戶查看命令,按回車鍵流程向下
break;//跳出此條件語句
}
}
if(feof(fp))//判斷文件指針是否指向文件末尾
{
printf("您所查詢的圖書不存在");
getchar();//等待用戶查看信息,按回車鍵流程向下
}
fclose(fp); //關閉文件
fflush(stdin);//清除緩存
}
void search2()//writer search
{
char writer[10];
printf("請輸入要查找的作者名:\n");
fflush(stdin);//清除緩存
gets(writer);
fp = fopen("book.txt","rb");//以二進制只讀方式打開文件
while(!feof(fp))//判斷文件是否到達末尾
{
fread(&book,sizeof(book),1,fp);
if(strcmp(writer,book.writer) == 0)
{
printf("已找到目標圖書:\n");
printf(" 書名 作者 分類號 出版單位 時間 價格\n");
printf("%10s%10s ",book.name,book.writer);
printf("%10s%8s%10s%10s\n ",book.num,book.addr,book.time,book.price );
printf("\n按回車鍵返回主菜單");
getchar();//等待用戶查看命令,按回車鍵流程向下
break;//跳出此條件語句
}
}
if(feof(fp))//判斷文件指針是否指向文件末尾
{
printf("您所查詢的圖書不存在");
getchar();//等待用戶查看信息,按回車鍵流程向下
}
fclose(fp); //關閉文件
fflush(stdin);//清除緩存
}
void modify()//修改
{
char modname[10],name[10],writer[10],numx[12],addrx[8],time[8],price[8];//定義臨時的數組用來存放臨時數據
int a,b,c,d,f,g=1;
int flag;
char ch;
FILE *fp1,*fp2;//聲明兩個文件指針fp1,fp2
printf("請輸入修改的圖書名:\n");
fflush(stdin);//清除緩存
gets(modname);
do
{
if((fp1 = fopen("book.txt","rb")) == NULL)//用只讀方式打開一個二進制文件,如果返回的指針爲空
{
printf("\n不能打開 book.txt文件");
getchar();
exit(1);//跳出此條件語句
}
if((fp2 = fopen("temp.txt","wb")) == NULL)//用只寫方式打開一個二進制文件,如果返回的指針爲空
{
printf("\n不能打開 book.txt文件");
getchar();
exit(1);//跳出此條件語句
}
printf("請輸入要改的圖書名\n");
gets(modname);
flag=0;
while(fread(&book,sizeof(book),1,fp1) == 1)
{
if(strcmp(book.name,modname) == 0)
{
printf("修改圖書名嗎?(1)");
scanf("%d",&a);
getchar();
if(a == 1)
{
printf("請輸入圖書名:");
gets(name);
strcpy(book.name, name);
}
printf("修改作者嗎?(2)");
scanf("%d",&b);
getchar();//等待用戶確認
if(b == 2)
{
printf("請輸入作者:");
gets(writer);
strcpy(book.writer,writer);
}
printf("修改分類號嗎?(3)");
scanf("%d",&c);
getchar();//等待用戶確認
if(c == 3)
{
printf("請輸入分類號:");
gets(numx);
strcpy(book.num,numx);
}
printf("修改出版單位嗎?(4)");
scanf("%d",&d);
getchar();
if(d == 4)
{
printf("請輸入出版單位:");
gets(addrx);
strcpy(book.addr,addrx);
}
printf("修改出版時間嗎?(5)");
scanf("%d",&f);
getchar();
if(f == 5)
{
printf("請輸入出版時間:");
gets(time);
strcpy(book.time,time);
}
printf("修改價格嗎?(6)");
scanf("%d",&g);
getchar();
if(g == 6)
{
printf("請輸入價格:");
gets(price);
strcpy(book.price,price);
}
flag=1;
}
fwrite(&book,sizeof(book),1,fp2);//將數據作爲一個整體一次性寫入磁盤文件
}
fclose(fp1);
fclose(fp2);
if(flag == 1)
{
printf("修改成功");
remove("book.txt");//刪除原文件
rename("temp.txt","book.txt");//將臨時文件命名爲book.txt
}
else
{
printf("找不到此記錄");
getchar();
}
printf("繼續修改嗎?(y/n)");
ch=getchar();//接受字符
getchar();
}while(ch == 'Y' || ch == 'y');
}
void del()//刪除
{
char name[10];
int flag;
char ch;
FILE *fp1,*fp2;//聲明兩個文件指針fp1,fp2
do
{
if((fp1 = fopen("book.txt","rb")) == NULL)
{
printf("\n不能打開 book.txt文件");
getchar();
exit(1);
}
if((fp2 = fopen("temp.txt","wb")) == NULL)
{
printf("\n不能打開 book.txt文件");
getchar();
exit(1);
}
printf("請輸入要刪除的圖書名:");
fflush(stdin);//清除緩存
gets(name);
flag = 0;
while(!feof(fp1))//判斷文件fp1是否指向文件末尾
{
fread(&book,sizeof(book),1,fp1);
if(strcmp(name,book.name) == 0)
{
flag = 1;
}
else
{
fwrite(&book,sizeof(book),1,fp2);//將數據作爲一個整體一次性寫入磁盤文件
}
}
fclose(fp1);//關閉文件
fclose(fp2);//關閉文件
if(flag == 1)
{
remove("book.txt");//移除文件
rename("temp.txt","book.txt");
printf("刪除成功!\n");
}
else
{
printf("找不到圖書名");
remove("temp.txt");//移除文件
}
printf("繼續刪除其他圖書名嗎?(y/n)");
fflush(stdin);//清除緩存
ch = getchar();
getchar();
}while(ch == 'y' || ch == 'Y');
fflush(stdin);//清除緩存
}
編譯器爲dev C++ ,第一次發多有不足,請指正。