歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C鏈表和文件操作實戰--圖書管理系統

C鏈表和文件操作實戰--圖書管理系統

日期:2017/3/1 10:19:48   编辑:Linux編程

這個貌似是我們大一的C語言課程設計,當時是從網上下的代碼,然後修改了一下.現在想想好慚愧,哎我好想重新開始,以前自己的確失去了好多東西,希望今後的自己好好......

時間過的真快,現在都大三了,馬上也要滾蛋了,再滾蛋之前好好修煉內功.於是我又重新拾起了久違的C語言,用了幾天時間認真看完了Programming in c,個人覺得這本書講得真好,

收益亮多.回想起大一學的C語言,我們用的教材是學校自己編的,往事不堪回首啊....記得上學期我們學習數字信號處理,我麼用的也是學校自己編的書,當時上課最有特色的地方就是:我們那個老師每節課都要花好長時間糾正書裡的錯誤,他經常說的一句話是-還好當時我沒參加編寫這本書,不然還不被罵死.......

我始終想不明白的是有那麼多經典的好書,學校不用,非要自己去編那麼操蛋的書.這學期我們學習XML應用教材,當時老師說本來想用那本書的,覺得很好.最後學校不同意,理由竟是:那本是高職的書,我們是本科....我聽完淚流滿面啊.我們的大學,我們的老師,你們什麼時候才能不浮躁???

哎,本來我不想說什麼,但已經到這個地步了,就再多廢話幾句吧.我們學了微機原理,老師沒在課上編過.調試過一個程序,那麼經典的debug工具都不提...;我們學了計算機網絡,天天講各種包,老師從沒在課上用抓包軟件抓過一個包,分析過一個包...;我們學了組網技術,老師給我的模擬器不知道是哪一年的,ospf都不支持,天天說cisco,沒介紹過packettracer, dynamips...淚流滿面啊,我們的學校很差,但真的差到這個地步了嗎? 老師們,你們每天都在想什麼了,能不浮躁嗎? 天天說上課學生不聽講,天天說上課人數少,為什麼呀?我們學生是有問題,但你們呢? 你們真的對得起你們拿的工資嗎?

哎,話多了.一個學生的牢騷而已....

stop,不說了,呵呵.

主要是想起了大一做的課程設計,所以自己動手做了下,不過我這個事簡化版,呵呵,溫故而知新.

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. #define books "f:\\books.txt"
  6. #define booksbak "f:\\booksbak.txt"
  7. struct bookinfo
  8. {
  9. char isbn[20];
  10. char title[30];
  11. char author[20];
  12. int count;
  13. };
  14. struct book
  15. {
  16. struct bookinfo onebook;
  17. struct book *next;
  18. };
  19. struct book *searchBook ( struct book *listptr,char isbn[])
  20. {
  21. while(listptr!=(struct book *)0)
  22. if (strcmp(listptr->onebook.isbn,isbn)==0)
  23. return listptr;
  24. else
  25. listptr=listptr->next;
  26. return (struct book *)0;
  27. }
  28. void MainSearchbook(struct book *firstptr)
  29. {
  30. struct book *ptr;
  31. char isbnno[20];
  32. printf("請輸入ISBN:");
  33. scanf("%s",&isbnno);
  34. ptr=searchBook(firstptr,isbnno);
  35. if (ptr!=(struct book *)0)
  36. {
  37. printf("找到了!!!\n");
  38. printf("ISBN:%s\n",ptr->onebook.isbn);
  39. printf("Title:%s\n",ptr->onebook.title);
  40. printf("Author:%s\n",ptr->onebook.author);
  41. }
  42. else
  43. printf("sorry,not found!!!\n");
  44. }
  45. int addBook(struct book *listptr,struct bookinfo note)
  46. {
  47. while(listptr->next!=0)
  48. listptr=listptr->next;
  49. listptr->next=(struct book *)malloc(sizeof(struct book));
  50. listptr->next->onebook=note;
  51. listptr->next->next=0;
  52. return 0;
  53. }
  54. void MainAdd(struct book *listptr,FILE *fp)
  55. {
  56. int ok;
  57. struct bookinfo note;
  58. printf("請輸入ISBN:");
  59. scanf("%s",¬e.isbn);
  60. printf("請輸入Title:");
  61. scanf("%s",¬e.title);
  62. printf("請輸入Author:");
  63. scanf("%s",¬e.author);
  64. ok=addBook(listptr,note);
  65. if (ok==0)
  66. {
  67. //將加入的圖書寫到文件中保存
  68. fprintf(fp,"\n%s %s %s %d",note.isbn,note.title,note.author,0);
  69. printf("添加圖書成功!!!\n");
  70. }
  71. else
  72. printf("添加圖書失敗!!!\n");
  73. }
  74. int removeBook(struct book *listptr,char isbn[])
  75. {
  76. while(listptr->next!=(struct book *)0)
  77. {
  78. if (strcmp(listptr->next->onebook.isbn,isbn)==0)
  79. {
  80. listptr->next=listptr->next->next;
  81. return 0;
  82. }
  83. else
  84. listptr=listptr->next;
  85. }
  86. return -1;
  87. }
  88. void MainRemove(struct book *listptr,FILE *fp)
  89. /************************************************************************/
  90. /* 刪除書籍函數,通過ISBN刪除鏈表節點,同時刪除文件中對應信息 */
  91. /* 刪除文件中一行,用的是笨方法,把需要的信息寫到新文件,刪除舊文件,重命名..*/
  92. /************************************************************************/
  93. {
  94. char isbnno[20];
  95. int ok;
  96. struct bookinfo onebook;
  97. printf("請輸入ISBN:");
  98. scanf("%s",&isbnno);
  99. ok=removeBook(listptr,isbnno);
  100. if (!ok)
  101. {
  102. FILE *fpbak;
  103. if ((fpbak=fopen(booksbak,"a+"))==NULL)
  104. printf("文件打開失敗!!!\n");
  105. fseek(fp,0,SEEK_SET); //移到文件開始
  106. while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
  107. {
  108. if (strcmp(onebook.isbn,isbnno)!=0)
  109. {
  110. fprintf(fpbak,"%s %s %s %d\n",onebook.isbn,onebook.title,onebook.author,onebook.count);
  111. }
  112. }
  113. fclose(fp);
  114. fclose(fpbak);
  115. if (remove(books)) //刪除失敗返回非0
  116. {
  117. printf("刪除文件失敗!!!\n");
  118. return ;
  119. }
  120. else
  121. if (rename(booksbak,books)) //重命名失敗返回非0值
  122. {
  123. printf("重命名失敗!!!\n");
  124. return ;
  125. }
  126. printf("刪除成功!!!\n");
  127. }
  128. else
  129. printf("查無此書!!!");
  130. }
  131. int choice(void)
  132. {
  133. int c;
  134. printf("1.查看圖書\n");
  135. printf("2.添加圖書\n");
  136. printf("3.刪除圖書\n");
  137. printf("4.退出程序\n");
  138. printf("請選擇序號:");
  139. return c=getchar();
  140. //return c=getche();
  141. printf("\n\n");
  142. }
  143. int addEntry(FILE *fp,struct book *firstptr)
  144. /************************************************************************/
  145. /* 主要用來加載文件中存放的圖書信息 */
  146. /************************************************************************/
  147. {
  148. struct bookinfo onebook;
  149. while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
  150. {
  151. while(firstptr->next!=0)
  152. firstptr=firstptr->next;
  153. firstptr->next=(struct book *)malloc(sizeof(struct book));
  154. firstptr->next->onebook=onebook;
  155. firstptr->next->next=0;
  156. }
  157. return 0;
  158. }
  159. int main(int argc,char *argv[])
  160. {
  161. int ch;
  162. struct book first;
  163. strcpy(first.onebook.isbn,"123456");
  164. strcpy(first.onebook.title,"Programming C");
  165. strcpy(first.onebook.author,"yhb");
  166. first.next=0;
  167. struct book *firstptr=&first; //鏈表頭指針
  168. FILE *fp;
  169. if ((fp=fopen(books,"a+"))==NULL)
  170. printf("文件打開失敗!!!");
  171. addEntry(fp,firstptr);
  172. while(1)
  173. {
  174. system("CLS"); //清屏
  175. /************************************************************************/
  176. /* 想想這裡為什麼要清空緩沖區? */
  177. /*由於上一次(choice函數)的getchar(),還有一個'\n'留在緩沖區.... */
  178. /*可以把這句話注釋掉看看,沒有這句話會遇到麻煩 */
  179. /*如果不用fflush,可以將上面的getchar()換成getche() */
  180. /*比較getchar(),getch(),getche()...... */
  181. /************************************************************************/
  182. fflush(stdin);
  183. ch=choice()-48;
  184. switch (ch)
  185. {
  186. case 1:
  187. MainSearchbook(firstptr);
  188. break;
  189. case 2:
  190. MainAdd(firstptr,fp);
  191. break;
  192. case 3:
  193. MainRemove(firstptr,fp);
  194. break;
  195. case 4:
  196. printf("謝謝使用...\n");
  197. exit(0);
  198. default:
  199. printf("請輸入正確序號!");
  200. }
  201. system("PAUSE");
  202. }
  203. return 0;
  204. }

bookinfo結構體的count成員,本來是想做最近熱門圖書的, 通過用戶查看書籍,統計書籍浏覽的次數.發現更新文件中的數據很麻煩,於是就取消了.呵呵

books.txt裡面的數據大致如下所示:可以直接通過編輯books.txt增加書籍.

  1. 123 python yhb 2
  2. 456 linux lwy 4
  3. 789 c yl 5

文件操作用fread,fwrite應該更方便點.

Copyright © Linux教程網 All Rights Reserved