服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现图书管理系统(文件数据库)

C语言实现图书管理系统(文件数据库)

2022-10-17 13:29ztaiyizzz C/C++

这篇文章主要为大家详细介绍了C语言实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现图书管理系统的具体代码,供大家参考,具体内容如下

简介

c语言的一个大作业,发上来纪念下嘿嘿。写的不是很好,很多东西都揉在一起来,不过注释写的也挺多,希望能帮到有需要的朋友。

题目要求

简单文件数据库-模拟图书馆管理系统

涉及知识点:文件读写、内存管理、结构体定义、基本数据结构、高级格式化输入输出

要求:

编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。

命令行参数如下:

Libsim –a(-u) xxxx
第一个参数为可执行程序名称;第二个参数为用户身份,-a表示管理员,-u表示读者;第三个参数为用户名

实现的功能

1. 管理员:

  • 对图书进行管理:添加图书,修改图书名称、数量,删除图书。
  • 对读者进行管理:添加读者,修改读者名称,删除读者.
  • 一键查看全部书籍信息(序号,书名,剩余数量)
  • 一键查看全部读者信息(序号,读者名,所借阅书籍)
  • 单本图书详情查询:可根据序号和书名查找,向管理员展示图书序号、名称、剩余数量和借阅了此书的读者。

2. 读者:

  • 借阅图书(只能同时借阅一本书)
  • 还回图书
  • 一键查看全部书籍信息(序号,书名,剩余数量)

readme

需要从cmd命令行运行程序,如图(注意格式)

C语言实现图书管理系统(文件数据库)

管理员名:Zhang
进入管理员菜单格式:可执行程序名 -a Zhang (只设置了一个管理员,没有添加管理员的功能)
进入读者菜单格式:可执行程序名 -u 读者名 (需要先通过管理员添加读者)

默认生成的文件放在d盘根目录下(有时中间的过渡文件可能会没有被删除)

  • Book.txt :存放书籍信息
  • Users.txt :存放读者信息

代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
#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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/ztaiyizzz/article/details/106643121

延伸 · 阅读

精彩推荐