您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C語言如何實現圖書管理系統的文件數據庫”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言如何實現圖書管理系統的文件數據庫”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
簡單文件數據庫-模擬圖書館管理系統
涉及知識點:文件讀寫、內存管理、結構體定義、基本數據結構、高級格式化輸入輸出
要求:
編寫一個程序模擬圖書管理系統。用戶分為管理員和讀者兩類,分別顯示不同文本格式菜單,通過菜單項對應數字進行選擇。讀者菜單包括借書、還書、查詢等功能。管理員菜單包括圖書和讀者信息錄入、修改和刪除。圖書信息至少應包括:編號、書名、數量,讀者信息至少應包括:編號、姓名、所借圖書。可根據圖書名稱或編號進行圖書信息查詢,可查詢某本書現在被哪些讀者借走。
命令行參數如下:
Libsim –a(-u) xxxx
第一個參數為可執行程序名稱;第二個參數為用戶身份,-a表示管理員,-u表示讀者;第三個參數為用戶名
1. 管理員:
對圖書進行管理:添加圖書,修改圖書名稱、數量,刪除圖書。
對讀者進行管理:添加讀者,修改讀者名稱,刪除讀者.
一鍵查看全部書籍信息(序號,書名,剩余數量)
一鍵查看全部讀者信息(序號,讀者名,所借閱書籍)
單本圖書詳情查詢:可根據序號和書名查找,向管理員展示圖書序號、名稱、剩余數量和借閱了此書的讀者。
2. 讀者:
借閱圖書(只能同時借閱一本書)
還回圖書
一鍵查看全部書籍信息(序號,書名,剩余數量)
readme
需要從cmd命令行運行程序,如圖(注意格式)
管理員名:Zhang
進入管理員菜單格式:可執行程序名 -a Zhang (只設置了一個管理員,沒有添加管理員的功能)
進入讀者菜單格式:可執行程序名 -u 讀者名 (需要先通過管理員添加讀者)
默認生成的文件放在d盤根目錄下(有時中間的過渡文件可能會沒有被刪除)
Book.txt :存放書籍信息
Users.txt :存放讀者信息
#include<stdio.h> #include <io.h> int bookNumber = 1; //全局變量 表示圖書的序號 int usersNumber = 1; //表示讀者編號 char enter; //接收換行符 //添加圖書的函數 void addBook(FILE *Book) { FILE *Book1; //當文件和書本都存在時需要新建文件來更改信息 int judgeName = 0; //判斷此書是否已經被存放 int num = 1, readNum, readNumber; //書本的數量 存放讀到的書本數量 讀到的書本序號 char name[20] = {0}, readName[20] = {0}; //存放圖書名字 暫時存放讀到的字符串名 printf("請輸入要添加的圖書名:"); for(int i = 0; i<20; i++) //從輸入流取得需要添加的書本名字 { if(i==0) scanf("%c%c", &enter,&name[i]); else scanf("%c",&name[i]); if(name[i]==10) //將最后的換行符改為空 { name[i]=0; break; } } if(access("d:/Book.txt",F_OK)==0) //access函數判斷文件是否存在,存在返回值為0 使用的頭文件為io { judgeName = 1; FILE *judge = fopen("d:/Book.txt", "r"); //讀取數據文件,查找是否已經存在此書 while(!feof(judge)) { fscanf(judge, "%d %s %d", &readNumber, readName, &readNum); //由于readName已經表示地址,不需要取地址符 fscanf(judge,"\n"); //讀入換行符,準備下一行的讀取 if(strcmp(name, readName)==0) //發現已經存在此書后跳出循環 { judgeName = 2; //為2時表示已經存在此書,需要新建一個文件來更改信息 break; } } fclose(judge); //關閉用于判斷而打開的文件 bookNumber = readNumber+1; if(judgeName==1) Book = fopen("d:/Book.txt", "a"); //文件存在 且不存在相同書名時向后追加內容 else if(judgeName==2) { Book1 = fopen("d:/Book1.txt", "w"); //新建一個文件暫存Book中的信息,最后再返回源文件中 Book = fopen("d:/Book.txt","r"); //只讀打開原本的文件 } } else Book = fopen("d:/Book.txt","w"); //文件不存在時新建一個文件 if (judgeName<2) { fprintf(Book, "%d %s %d\n", bookNumber, name, num); //寫入序號 書名 數量和換行符 bookNumber++; fclose(Book); } else { while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(name, readName)==0) fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum+1); //寫入序號 書名 數量+1和換行符 else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //寫入序號 書名 數量和換行符 } bookNumber++; fclose(Book); //關閉文件 fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } fclose(Book); fclose(Book1); remove("d:/Book1.txt"); //刪除原文件 //rename("d:/Book1.txt", "d:/Book.txt"); //將更改后的文件改名為原數據文件 } printf("添加成功!\n"); } //修改圖書信息函數 void changeBook(FILE *Book) { while(1) { char name[20] = {0}, readName[20] = {0}; printf(" Edit Book Information \n"); printf("[------------------------------------------]\n"); printf("\t請選擇需要修改的信息:\n 1.修改圖書名稱\n 2.修改圖書數量\n 3.返回主菜單\n"); printf("[------------------------------------------]\n"); int function, readNumber, readNum, find = 0; //功能選擇 讀取到的序號 讀取到的數量 是否找到此書 //判斷修改后的書名是否和原有的重復 Book = fopen("d:/Book.txt","r"); //只讀打開原文件 int ifNumber, ifNum; char ifName[20] = {0}; FILE *ifUserExisted = fopen("d:/Users1.txt","w"); while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &ifNumber, ifName, &ifNum); fprintf(ifUserExisted, "%d %s %d\n", &ifNumber, ifName, ifNum); } fclose(ifUserExisted); fclose(Book); scanf("%d",&function); if(function == 3) { remove("d:/Book1.txt"); //有時會多余創造了文件,需要刪除 return; } Book = fopen("d:/Book.txt","r"); //只讀打開原文件 FILE *Book1 = fopen("d:/Book1.txt", "w"); //先新建一個文件存儲更改后的信息 printf("請輸入需要更改的圖書名:"); for(int i = 0; i<20; i++) //從輸入流取得需要添加的書本名字 { if(i==0) scanf("%c%c", &enter,&name[i]); else scanf("%c",&name[i]); if(name[i]==10) //將最后的換行符改為空 { name[i]=0; break; } } if(function==1) { while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(name, readName)==0) { find = 1; //找到了此書 printf("您要將書名%s更改為:", name); char changeName[20] = {0}; for(int i = 0; i<20; i++) //從輸入流取得需要更改的書本名字 { if(i==0) scanf("%c",&changeName[i]); else scanf("%c",&changeName[i]); if(changeName[i]==10) //將最后的換行符改為空 { changeName[i]=0; break; } } ifUserExisted = fopen("d:/Users1.txt","r"); //判斷更改后的名字是否會和已存在的書名沖突 while(!feof(ifUserExisted)) { fscanf(ifUserExisted, "%d %s %d\n", &ifNumber, ifName, &ifNum); if (strcmp(changeName, ifName)==0) { printf("更改失敗:已存在名稱為%s的圖書\n", changeName); fclose(ifUserExisted); fclose(Book); //關閉文件 fclose(Book1); return; } } fprintf(Book1, "%d %s %d\n", readNumber, changeName, readNum); //寫入序號 更改后的書名 數量和換行符 } else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //寫入序號 書名 數量和換行符 } if(find==0) //若沒找到此書 { printf("沒有找到此書!請重新輸入\n"); break; } fclose(Book); //關閉文件 fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } fclose(Book); fclose(Book1); remove("d:/Book1.txt"); //刪除原文件 //rename("d:/Book1.txt", "d:/Book.txt"); //將更改后的文件改名為原數據文件 此方法成功率低!!! printf("更改成功!\n"); } else if(function == 2) { while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(name, readName)==0) { find = 1; //找到了此書 printf("您要將數量%d更改為:", readNum); int newNum = 0; scanf("%d",&newNum); fprintf(Book1, "%d %s %d\n", readNumber, readName, newNum); //寫入序號 書名 更改后的數量和換行符 } else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //寫入序號 書名 數量和換行符 } if(find==0) //若沒找到此書 { printf("沒有找到此書!請重新輸入"); break; } fclose(Book); //關閉文件 fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } fclose(Book); fclose(Book1); remove("d:/Book1.txt"); //刪除原文件 //rename("d:/Book1.txt", "d:/Book.txt"); //將更改后的文件改名為原數據文件 此方法易出現問題!!! printf("更改成功!\n"); } else { printf("輸入格式有誤,請重新輸入!"); break; } } } //刪除書籍的函數 void delBook(FILE *Book) { while(1) { printf("請輸入您想刪除的圖書名:(輸入\"-r\"返回上一級)"); char delName[20] = {0}; for(int i = 0; i<20; i++) //從輸入流取得需要刪除的書本名字 { //if(i==0) // scanf("%c%c", &enter,&delName[i]); //else scanf("%c",&delName[i]); if(delName[i]==10) //將最后的換行符改為空 { delName[i]=0; break; } } if(strcmp(delName, "-r")==0) //輸入返回上一級的指示后返回 return; int readNumber, readNum, find = 0; char readName[20] = {0}; Book = fopen("d:/Book.txt","r"); FILE *Book1 = fopen("d:/Book1.txt","w"); while (!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(delName, readName)==0) { find = 1; //找到了此書 //因為要刪除此條信息,所以不再向新文件中輸出它 } else { if(find==1) fprintf(Book1, "%d %s %d\n", readNumber-1, readName, readNum); //排在刪除后的寫入-1的序號 書名 數量和換行符 else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //刪除前的寫入的序號 書名 數量和換行符 } } if(find==0) //若沒找到此書 { printf("沒有找到此書!請重新輸入\n"); continue; } fclose(Book); fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } fclose(Book); fclose(Book1); remove("d:/Book1.txt"); //刪除原文件 printf("刪除成功!\n"); } } //展示全部圖書的函數 void showBook(FILE *Book) { printf(" Library \n"); printf("[------------------------------------------]\n"); printf("\t序號\t書名\t\t數量\n"); char readName[20] = {0}; int readNumber, readNum; Book = fopen("d:/Book.txt", "r"); while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); printf("\t%d\t%s\t\t%d\n",readNumber, readName, readNum); } fclose(Book); printf("[------------------------------------------]\n"); } //向管理員展示全部用戶的函數 void showUsers(FILE *Users) { printf(" Users \n"); printf("[------------------------------------------]\n"); printf("\t序號\t姓名\t所借閱圖書\n"); char readName[20] = {0}, borrowBook[20] = {0}; int readNumber; Users = fopen("d:/Users.txt", "r"); while(!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); printf("\t%d\t%s\t%s\n",readNumber, readName, borrowBook); } fclose(Users); printf("[------------------------------------------]\n"); } //添加用戶函數 void addUsers(FILE *Users) { FILE *Users1; //當文件和用戶都存在時需要新建文件來更改信息 int judgeName = 0; //判斷此用戶是否已經存在 int num = 1, readNumber; // 存放讀到的書本數量 讀到的用戶序號 char name[20] = {0}, readName[20] = {0}, borrowBook[20] = {"None"},readBorrowBook[20] = {"None"}; //存放用戶名字 暫時存放讀到的字符串名 printf("請輸入要添加的用戶名:"); for(int i = 0; i<20; i++) //從輸入流取得需要添加的用戶名 { if(i==0) scanf("%c%c", &enter,&name[i]); else scanf("%c",&name[i]); if(name[i]==10) //將最后的換行符改為空 { name[i]=0; break; } } if(access("d:/Users.txt",F_OK)==0) //access函數判斷文件是否存在,存在返回值為0 使用的頭文件為io { judgeName = 1; FILE *judge = fopen("d:/Users.txt", "r"); //讀取數據文件,查找是否已經存在此用戶 while(!feof(judge)) { fscanf(judge, "%d %s %s", &readNumber, readName, readBorrowBook); //由于readName已經表示地址,不需要取地址符 fscanf(judge,"\n"); //讀入換行符,準備下一行的讀取 if(strcmp(name, readName)==0) //發現已經存在此用戶后跳出循環 { printf("已經存在此用戶,無法添加。"); //已經存在此用戶,返回 return; } } fclose(judge); //關閉用于判斷而打開的文件 usersNumber = readNumber+1; if(judgeName==1) Users = fopen("d:/Users.txt", "a"); //文件存在 且不存在相同用戶時向后追加內容 } else Users = fopen("d:/Users.txt","w"); //文件不存在時新建一個文件 fprintf(Users, "%d %s %s\n", usersNumber, name, borrowBook); //寫入序號 用戶名 所借書和換行符 usersNumber++; fclose(Users); printf("添加成功!\n"); } //修改讀者信息函數 void changeUsers(FILE *Users) { while(1) { char name[20] = {0}, readName[20] = {0}, borrowBook[20] = {"None"}; printf(" Edit Reader Name \n"); printf("[------------------------------------------]\n"); printf("\t請選擇需要修改的信息:\n 1.修改讀者名稱\n 2.返回主菜單\n"); printf("[------------------------------------------]\n"); int function, readNumber, find = 0; //功能選擇 讀取到的序號 是否找到此書 Users = fopen("d:/Users.txt","r"); //只讀打開原文件 //此處創建ifUserExisted,一會用于查找是否存在相同的名字 int ifNumber; char ifName[20] = {0}, ifBorrow[20] = {0}; FILE *ifUserExisted = fopen("d:/Book1.txt","w"); while(!feof(Users)) { fscanf(Users, "%d %s %s\n", &ifNumber, ifName, ifBorrow); fprintf(ifUserExisted, "%d %s %s\n", &ifNumber, ifName, ifBorrow); } fclose(ifUserExisted); fclose(Users); Users = fopen("d:/Users.txt","r"); //只讀打開原文件 scanf("%d",&function); if(function == 2) { remove("d:/Users1.txt"); //有時會多余創造了文件,需要刪除 return; } FILE *Users1 = fopen("d:/Users1.txt", "w"); //先新建一個文件存儲更改后的信息 printf("請輸入需要更改的用戶名:"); for(int i = 0; i<20; i++) //從輸入流取得需要更改的讀者名字 { if(i==0) scanf("%c%c", &enter,&name[i]); else scanf("%c",&name[i]); if(name[i]==10) //將最后的換行符改為空 { name[i]=0; break; } } if(function==1) { while(!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); if(strcmp(name, readName)==0) { find = 1; //找到了此讀者 printf("您要將讀者名\"%s\"更改為:", name); char changeName[20] = {0}; for(int i = 0; i<20; i++) //從輸入流取得需要更改的用戶名字 { if(i==0) scanf("%c",&changeName[i]); else scanf("%c",&changeName[i]); if(changeName[i]==10) //將最后的換行符改為空 { changeName[i]=0; break; } } ifUserExisted = fopen("d:/Book1.txt","r"); //判斷更改后的名字是否會和存在的用戶名沖突 while(!feof(ifUserExisted)) { fscanf(ifUserExisted, "%d %s %s\n", &ifNumber, ifName, ifBorrow); if (strcmp(changeName, ifName)==0) { printf("更改失敗:已存在名稱為%s的讀者\n", changeName); fclose(ifUserExisted); fclose(Users); //關閉文件 fclose(Users1); return; } } fprintf(Users1, "%d %s %s\n", readNumber, changeName, borrowBook); //寫入序號 更改后的讀者名 所借書籍和換行符 } else fprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook); //寫入序號 書名 數量和換行符 } if(find==0) //若沒找到此讀者 { printf("沒有找到此讀者!請重新輸入\n"); break; } fclose(Users); //關閉文件 fclose(Users1); Users1 = fopen("d:/Users1.txt", "r"); Users = fopen("d:/Users.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Users1)) { fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook); fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook); } fclose(Users); fclose(Users1); remove("d:/Users1.txt"); //刪除原文件 //rename("d:/Book1.txt", "d:/Book.txt"); //將更改后的文件改名為原數據文件 此方法成功率低!!! printf("更改成功!\n"); } else { printf("輸入格式有誤,請重新輸入!\n"); break; } } } //刪除用戶的函數 void delUsers(FILE *Users) { while(1) { printf("請輸入您想刪除的讀者名:(輸入\"-r\"返回上一級)"); char delName[20] = {0}; for(int i = 0; i<20; i++) //從輸入流取得需要刪除的用戶名字 { //if(i==0) // scanf("%c%c", &enter,&delName[i]); //else scanf("%c",&delName[i]); if(delName[i]==10) //將最后的換行符改為空 { delName[i]=0; break; } } if(strcmp(delName, "-r")==0) //輸入返回上一級的指示后返回 return; int readNumber, find = 0; char readName[20] = {0}, borrowBook[20] = {"None"}; Users = fopen("d:/Users.txt","r"); FILE *Users1 = fopen("d:/Users1.txt","w"); while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); if(strcmp(delName, readName)==0) { find = 1; //找到了此讀者 //因為要刪除此條信息,所以不再向新文件中輸出它 } else { if(find==1) fprintf(Users1, "%d %s %s\n", readNumber-1, readName, borrowBook); //排在刪除后的寫入-1的序號 讀者名 所借書和換行符 else fprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook); //刪除前的寫入的序號 讀者名 所借書和換行符 } } if(find==0) //若沒找到此讀者 { printf("沒有找到此讀者!請重新輸入\n"); continue; } fclose(Users1); fclose(Users); Users1 = fopen("d:/Users1.txt", "r"); Users = fopen("d:/Users.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Users1)) { fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook); fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook); } fclose(Users1); fclose(Users); remove("d:/Users1.txt"); //刪除原文件 printf("刪除成功!\n"); } } //借閱函數 void borrowBooking(char readerName[]) { printf("請輸入您想借閱的圖書名:"); char name[20] = {0}; for(int i = 0; i<20; i++) //從輸入流取得圖書名 { if(i==0) scanf("%c%c", &enter,&name[i]); else scanf("%c",&name[i]); if(name[i]==10) //將最后的換行符改為空 { name[i]=0; break; } } char readName[20] = {0}; int readNumber, readNum, find = 0; //更改被借閱的圖書的信息 FILE *Book = fopen("d:/Book.txt", "r"); FILE *Book1 = fopen("d:/Book1.txt", "w"); while (!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(name, readName)==0) { find = 1; if(readNum<1) { printf("借閱失敗:無剩余可借閱的%s!\n", readName); return; } fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum-1); //若找到需要借閱的圖書,則在此書數量上減1 } else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //刪除前的寫入的序號 讀者名 所借書和換行符 } if(find==0) //若沒找到此書 { printf("借閱失敗:沒有找到此書!\n"); return; } fclose(Book); fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } fclose(Book1); fclose(Book); remove("d:/Book1.txt"); //刪除原文件 //更改讀者的信息 FILE *Users = fopen("d:/Users.txt", "r"); FILE *Users1 = fopen("d:/Users1.txt", "w"); char borrowBook[20] = {"None"}; while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); if(strcmp(readerName, readName)==0) fprintf(Users1, "%d %s %s\n", readNumber, readName, name); //在讀者的借閱圖書上寫上所借閱的圖書名 else fprintf(Users1, "%d %s %s\n", readNumber, readName, borrowBook); } fclose(Users1); fclose(Users); Users1 = fopen("d:/Users1.txt", "r"); Users = fopen("d:/Users.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Users1)) { fscanf(Users1, "%d %s %s\n", &readNumber, readName, borrowBook); fprintf(Users, "%d %s %s\n", readNumber, readName, borrowBook); } fclose(Users1); fclose(Users); remove("d:/Users1.txt"); //刪除原文件 有時候還是刪不掉 printf("借閱成功!\n"); } //還書函數 void returnBooking(char readerName[], char borrowBook[]) { char readName[20] = {0}; int readNumber, readNum, find = 0; //更改被還回的圖書的信息 FILE *Book = fopen("d:/Book.txt", "r"); FILE *Book1 = fopen("d:/Book1.txt", "w"); while (!feof(Book)) { fscanf(Book, "%d %s %d\n", &readNumber, readName, &readNum); if(strcmp(borrowBook, readName)==0) { fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum+1); //若找到被還的圖書,則在此書數量上加1 find = 1; } else fprintf(Book1, "%d %s %d\n", readNumber, readName, readNum); //不是還回的書 } fclose(Book); fclose(Book1); Book1 = fopen("d:/Book1.txt", "r"); Book = fopen("d:/Book.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Book1)) { fscanf(Book1, "%d %s %d\n", &readNumber, readName, &readNum); fprintf(Book, "%d %s %d\n", readNumber, readName, readNum); } bookNumber = readNumber+1; fclose(Book1); fclose(Book); remove("d:/Book1.txt"); //刪除原文件 if(find==0) //還書時沒有書城中沒有此書,直接添加一本 { FILE *Book; Book = fopen("d:/Book.txt", "a"); fprintf(Book, "%d %s 1\n", bookNumber, borrowBook); //寫入序號 書名 數量和換行符 bookNumber++; fclose(Book); } //更改讀者的信息 FILE *Users = fopen("d:/Users.txt", "r"); FILE *Users1 = fopen("d:/Users1.txt", "w"); char rborrowBook[20] = {"None"}; while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, rborrowBook); if(strcmp(readerName, readName)==0) fprintf(Users1, "%d %s %s\n", readNumber, readName, "None"); //還回書后所借閱圖書變為"None" else fprintf(Users1, "%d %s %s\n", readNumber, readName, rborrowBook); } fclose(Users1); fclose(Users); Users1 = fopen("d:/Users1.txt", "r"); Users = fopen("d:/Users.txt", "w+"); //刷新原文件,再次寫入正確數據 while(!feof(Users1)) { fscanf(Users1, "%d %s %s\n", &readNumber, readName, rborrowBook); fprintf(Users, "%d %s %s\n", readNumber, readName, rborrowBook); } fclose(Users1); fclose(Users); remove("d:/Users1.txt"); //刪除原文件 有時候還是刪不掉 printf("成功還回%s\n", borrowBook); } //單獨查詢功能,根據編號或書名查詢書被哪些人借走 void searchBook() { while (1) { int function = 0; FILE *Book = fopen("d:/Book.txt", "r"); FILE *Users = fopen("d:/Users.txt", "r"); char readerName[20] = {0}, bookName[20] = {0}, borrowBook[20] = {0}, name[20] = {0}; int bookNumber, bookNum, find = 0, readerNumber; printf(" Search \n"); printf("[------------------------------------------]\n"); printf("\t\t請選擇查詢功能:\n\t1.根據編號查詢\n\t2.根據書名查詢\n\t3.返回主界面\n"); printf("[------------------------------------------]\n"); scanf("%d",&function); // 輸入需要的功能 switch (function) { case 1: printf("您要查找的書序號是:"); scanf("%d",&function); // 輸入需要查找的圖書編號 while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &bookNumber, bookName, &bookNum); //由于bookName已經表示地址,不需要取地址符 if(bookNumber==function) //發現查找的書后跳出循環 { find = 1;//找到書 break; } } if(find==0) { printf("沒有找到編號為%d的圖書。\n",function); break; } printf(" Search Result \n"); printf("[------------------------------------------]\n"); find = 0;//需要在查找誰借閱時再次使用 printf("\t編號:\t\t%d\n\t書名:\t\t%s\n\t剩余數量:\t%d\n\t",bookNumber, bookName, bookNum); while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readerNumber, readerName, borrowBook);//遍歷讀者查找誰借閱了這本書 if (strcmp(borrowBook, bookName)==0) { if(find==0) { find = 1; printf("借閱此書的讀者:"); printf("%s",readerName); } else printf(" ,%s",readerName); } } if(find==0) printf("還沒有讀者借閱此書。\n"); else printf("\n"); printf("[------------------------------------------]\n"); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 2: printf("您要查找的書名是:"); scanf("%s",name); // 輸入需要查找的圖書名 while(!feof(Book)) { fscanf(Book, "%d %s %d\n", &bookNumber, bookName, &bookNum); //由于bookName已經表示地址,不需要取地址符 if(strcmp(bookName, name)==0) //發現查找的書后跳出循環 { find = 1;//找到書 break; } } if(find==0) { printf("沒有找到名稱為%s的圖書。\n",name); break; } printf(" Search Result \n"); printf("[------------------------------------------]\n"); find = 0;//需要在查找誰借閱時再次使用 printf("\t編號:\t\t%d\n\t書名:\t\t%s\n\t剩余數量:\t%d\n\t",bookNumber, bookName, bookNum); while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readerNumber, readerName, borrowBook);//遍歷讀者查找誰借閱了這本書 if (strcmp(borrowBook, bookName)==0) { if(find==0) { find = 1; printf("借閱此書的讀者:"); printf("%s",readerName); } else printf(" ,%s",readerName); } } if(find==0) printf("還沒有讀者借閱此書。\n"); else printf("\n"); printf("[------------------------------------------]\n"); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 3: return; default: printf("您輸入的格式有誤,請重新輸入\n"); break; } fclose(Book); fclose(Users); } } int main(int argc, char *argv[]) //需要從命令行讀入參數 { char identity1[] = "-u"; //讀者身份 char identity2[] = "-a"; //管理員身份 FILE *Book, *Users; //兩個文件分別存儲圖書信息和讀者信息。 int function1, function2; //功能選項 /*調試用 char readerName[20] = {0}; int test = 0; scanf("%d %s",&test, readerName); if(test==1) */ if(strcmp(argv[1], identity2)==0) //管理員操作界面 { char Administrator[20] = "Zhang"; if(strcmp(Administrator, argv[2])==0) { while(1) { printf(" menu \n"); printf("[------------------------------------------]\n"); printf(" 管理員您好!請選擇您要使用的功能:\n 1.新增或修改圖書信息\n 2.新增或修改讀者信息\n 3.查看全部館藏書籍\n 4.查看全部讀者及其借閱信息\n 5.圖書詳情查詢\n 6.結束程序\n"); printf("[------------------------------------------]\n"); scanf("%d",&function1); switch (function1) { case 1: //更改圖書信息 printf(" Books \n"); printf("[------------------------------------------]\n"); printf("\t請選擇要對圖書進行的操作:\n 1.添加圖書信息\n 2.修改圖書信息\n 3.刪除圖書信息\n 4.返回主菜單\n"); printf("[------------------------------------------]\n"); scanf("%d",&function2); //輸入第二級操作指令 switch (function2) { case 1: addBook(Book); //調用添加圖書函數 break; case 2: changeBook(Book); //修改函數 break; case 3: scanf("%c",&enter); delBook(Book); //刪除函數 break; case 4: break; default: printf("輸入的值令有誤,請重新輸入"); break; } break; case 2: //更改讀者信息 printf(" Readers \n"); printf("[------------------------------------------]\n"); printf("\t請選擇要對用戶進行的操作:\n 1.添加用戶信息\n 2.修改用戶信息\n 3.刪除用戶信息\n"); printf("[------------------------------------------]\n"); scanf("%d",&function2); //輸入第二級操作指令 switch (function2) { case 1: addUsers(Users); //添加用戶信息 break; case 2: changeUsers(Users); //修改用戶信息 break; case 3: scanf("%c",&enter); delUsers(Users); //刪除用戶信息 break; default: printf("輸入的值令有誤,請重新輸入"); break; } break; case 3: showBook(Book); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 4: showUsers(Users); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 5: searchBook(); break; case 6: printf("感謝您的使用,再見!"); return 0; default: printf("輸入格式有誤,請重新輸入!"); break; } } } else printf("管理員名有誤,請重新輸入!"); } /* else if(test == 2) */ else if (strcmp(argv[1], identity1)==0) //讀者的操作界面 { char readName[20] = {0}, borrowBook[20] = {"None"}; int readNumber,find = 0; FILE *Users = fopen("d:/Users.txt","r"); //需要判斷是否存在此用戶 while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); if(strcmp(argv[2], readName)==0) { find = 1; break; } } fclose(Users); if(find==0) { printf("不存在用戶名為%s的讀者!", argv[2]); return 0; } while (1) { FILE *Users = fopen("d:/Users.txt","r"); //刷新用戶的借閱信息 while (!feof(Users)) { fscanf(Users, "%d %s %s\n", &readNumber, readName, borrowBook); if(strcmp(argv[2], readName)==0) break; } fclose(Users); printf(" menu \n"); printf("[------------------------------------------]\n"); printf("\t讀者%s您好!請選擇您要使用的功能:\n 1.借閱圖書\n 2.還回圖書\n 3.查看全部館藏書籍\n 4.結束程序\n", argv[2]); printf("[------------------------------------------]\n"); scanf("%d",&function1); switch (function1) { case 1: //借閱圖書 if(strcmp(borrowBook, "None")==0) borrowBooking(argv[2]); else printf("您已經借閱圖書,請先還書再進行借閱操作。\n"); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 2: //還書 if(strcmp(borrowBook, "None")!=0) returnBooking(argv[2], borrowBook); else printf("您當前還沒有借閱圖書。\n"); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 3: showBook(Book); printf("輸入回車返回...\n"); enter = getchar(); enter = getchar(); break; case 4: printf("感謝您的使用,再見!"); return 0; default: printf("輸入格式有誤,請重新輸入!"); break; } } } else printf("您輸入的格式有誤,請重新輸入!"); return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
讀到這里,這篇“C語言如何實現圖書管理系統的文件數據庫”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。