這個貌似是我們大一的C語言課程設計,當時是從網上下的代碼,然後修改了一下.現在想想好慚愧,哎我好想重新開始,以前自己的確失去了好多東西,希望今後的自己好好......
時間過的真快,現在都大三了,馬上也要滾蛋了,再滾蛋之前好好修煉內功.於是我又重新拾起了久違的C語言,用了幾天時間認真看完了Programming in c,個人覺得這本書講得真好,
收益亮多.回想起大一學的C語言,我們用的教材是學校自己編的,往事不堪回首啊....記得上學期我們學習數字信號處理,我麼用的也是學校自己編的書,當時上課最有特色的地方就是:我們那個老師每節課都要花好長時間糾正書裡的錯誤,他經常說的一句話是-還好當時我沒參加編寫這本書,不然還不被罵死.......
我始終想不明白的是有那麼多經典的好書,學校不用,非要自己去編那麼操蛋的書.這學期我們學習XML應用教材,當時老師說本來想用那本書的,覺得很好.最後學校不同意,理由竟是:那本是高職的書,我們是本科....我聽完淚流滿面啊.我們的大學,我們的老師,你們什麼時候才能不浮躁???
哎,本來我不想說什麼,但已經到這個地步了,就再多廢話幾句吧.我們學了微機原理,老師沒在課上編過.調試過一個程序,那麼經典的debug工具都不提...;我們學了計算機網絡,天天講各種包,老師從沒在課上用抓包軟件抓過一個包,分析過一個包...;我們學了組網技術,老師給我的模擬器不知道是哪一年的,ospf都不支持,天天說cisco,沒介紹過packettracer, dynamips...淚流滿面啊,我們的學校很差,但真的差到這個地步了嗎? 老師們,你們每天都在想什麼了,能不浮躁嗎? 天天說上課學生不聽講,天天說上課人數少,為什麼呀?我們學生是有問題,但你們呢? 你們真的對得起你們拿的工資嗎?
哎,話多了.一個學生的牢騷而已....
stop,不說了,呵呵.
主要是想起了大一做的課程設計,所以自己動手做了下,不過我這個事簡化版,呵呵,溫故而知新.
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <conio.h>
- #define books "f:\\books.txt"
- #define booksbak "f:\\booksbak.txt"
- struct bookinfo
- {
- char isbn[20];
- char title[30];
- char author[20];
- int count;
- };
-
- struct book
- {
- struct bookinfo onebook;
- struct book *next;
- };
-
- struct book *searchBook ( struct book *listptr,char isbn[])
- {
- while(listptr!=(struct book *)0)
- if (strcmp(listptr->onebook.isbn,isbn)==0)
- return listptr;
- else
- listptr=listptr->next;
- return (struct book *)0;
- }
-
-
- void MainSearchbook(struct book *firstptr)
- {
- struct book *ptr;
- char isbnno[20];
- printf("請輸入ISBN:");
- scanf("%s",&isbnno);
- ptr=searchBook(firstptr,isbnno);
- if (ptr!=(struct book *)0)
- {
- printf("找到了!!!\n");
- printf("ISBN:%s\n",ptr->onebook.isbn);
- printf("Title:%s\n",ptr->onebook.title);
- printf("Author:%s\n",ptr->onebook.author);
- }
- else
- printf("sorry,not found!!!\n");
- }
-
-
-
- int addBook(struct book *listptr,struct bookinfo note)
- {
- while(listptr->next!=0)
- listptr=listptr->next;
- listptr->next=(struct book *)malloc(sizeof(struct book));
- listptr->next->onebook=note;
- listptr->next->next=0;
- return 0;
-
- }
-
- void MainAdd(struct book *listptr,FILE *fp)
- {
- int ok;
- struct bookinfo note;
- printf("請輸入ISBN:");
- scanf("%s",¬e.isbn);
- printf("請輸入Title:");
- scanf("%s",¬e.title);
- printf("請輸入Author:");
- scanf("%s",¬e.author);
- ok=addBook(listptr,note);
- if (ok==0)
- {
- //將加入的圖書寫到文件中保存
- fprintf(fp,"\n%s %s %s %d",note.isbn,note.title,note.author,0);
- printf("添加圖書成功!!!\n");
- }
- else
- printf("添加圖書失敗!!!\n");
- }
-
-
- int removeBook(struct book *listptr,char isbn[])
- {
- while(listptr->next!=(struct book *)0)
- {
- if (strcmp(listptr->next->onebook.isbn,isbn)==0)
- {
- listptr->next=listptr->next->next;
- return 0;
- }
- else
- listptr=listptr->next;
- }
-
- return -1;
- }
-
- void MainRemove(struct book *listptr,FILE *fp)
- /************************************************************************/
- /* 刪除書籍函數,通過ISBN刪除鏈表節點,同時刪除文件中對應信息 */
- /* 刪除文件中一行,用的是笨方法,把需要的信息寫到新文件,刪除舊文件,重命名..*/
- /************************************************************************/
- {
- char isbnno[20];
- int ok;
- struct bookinfo onebook;
- printf("請輸入ISBN:");
- scanf("%s",&isbnno);
- ok=removeBook(listptr,isbnno);
- if (!ok)
- {
- FILE *fpbak;
- if ((fpbak=fopen(booksbak,"a+"))==NULL)
- printf("文件打開失敗!!!\n");
- fseek(fp,0,SEEK_SET); //移到文件開始
- while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
- {
- if (strcmp(onebook.isbn,isbnno)!=0)
- {
- fprintf(fpbak,"%s %s %s %d\n",onebook.isbn,onebook.title,onebook.author,onebook.count);
- }
- }
- fclose(fp);
- fclose(fpbak);
- if (remove(books)) //刪除失敗返回非0
- {
- printf("刪除文件失敗!!!\n");
- return ;
- }
- else
- if (rename(booksbak,books)) //重命名失敗返回非0值
- {
- printf("重命名失敗!!!\n");
- return ;
- }
-
- printf("刪除成功!!!\n");
- }
- else
- printf("查無此書!!!");
- }
-
- int choice(void)
- {
- int c;
- printf("1.查看圖書\n");
- printf("2.添加圖書\n");
- printf("3.刪除圖書\n");
- printf("4.退出程序\n");
- printf("請選擇序號:");
- return c=getchar();
- //return c=getche();
- printf("\n\n");
-
- }
-
- int addEntry(FILE *fp,struct book *firstptr)
- /************************************************************************/
- /* 主要用來加載文件中存放的圖書信息 */
- /************************************************************************/
-
- {
- struct bookinfo onebook;
- while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
- {
- while(firstptr->next!=0)
- firstptr=firstptr->next;
- firstptr->next=(struct book *)malloc(sizeof(struct book));
- firstptr->next->onebook=onebook;
- firstptr->next->next=0;
- }
- return 0;
-
- }
-
-
- int main(int argc,char *argv[])
- {
- int ch;
- struct book first;
- strcpy(first.onebook.isbn,"123456");
- strcpy(first.onebook.title,"Programming C");
- strcpy(first.onebook.author,"yhb");
- first.next=0;
- struct book *firstptr=&first; //鏈表頭指針
- FILE *fp;
- if ((fp=fopen(books,"a+"))==NULL)
- printf("文件打開失敗!!!");
- addEntry(fp,firstptr);
- while(1)
- {
- system("CLS"); //清屏
- /************************************************************************/
- /* 想想這裡為什麼要清空緩沖區? */
- /*由於上一次(choice函數)的getchar(),還有一個'\n'留在緩沖區.... */
- /*可以把這句話注釋掉看看,沒有這句話會遇到麻煩 */
- /*如果不用fflush,可以將上面的getchar()換成getche() */
- /*比較getchar(),getch(),getche()...... */
- /************************************************************************/
- fflush(stdin);
- ch=choice()-48;
- switch (ch)
- {
- case 1:
- MainSearchbook(firstptr);
- break;
- case 2:
- MainAdd(firstptr,fp);
- break;
- case 3:
- MainRemove(firstptr,fp);
- break;
- case 4:
- printf("謝謝使用...\n");
- exit(0);
- default:
- printf("請輸入正確序號!");
- }
- system("PAUSE");
- }
- return 0;
- }
bookinfo結構體的count成員,本來是想做最近熱門圖書的, 通過用戶查看書籍,統計書籍浏覽的次數.發現更新文件中的數據很麻煩,於是就取消了.呵呵
books.txt裡面的數據大致如下所示:可以直接通過編輯books.txt增加書籍.
- 123 python yhb 2
- 456 linux lwy 4
- 789 c yl 5
文件操作用fread,fwrite應該更方便點.