【C语言项目实战7——文件】

文件

文件的打开:

ANSI C规定了标准/输出函数库,用fopen函数来实现打开文件。fopen函数的原型定义在头文件stdio.h中。
一般形式:
FILE *fp; fp=fopen(filename,mode);
fopen函数有两个参数:
filename:一个指向字符的指针
mode:系统规定的字符串,表示文件的操作属性
mode字符串对应的操作模式:

读写方式 文件类型 含义 读写方式 文件类型 含义
“r” 文本文件 打开文本,只读 “rb+” 二进制文件 打开二进制文件,读、覆盖写
“w” 文本文件 建立文本文件,只写 “wb+” 二进制文件 打开二进制文件,先写后读
“a” 文本文件 打开文本文件,追加 “ab+” 二进制文件 打开二进制文件,读,追加
“rb” 二进制文件 打开二进制文件,只读 “rt” 文本文件 打开文本文件,只读
“wb” 二进制文件 建立二进制文件,只写 “wt” 文本文件 建立文本文件,只写
“ab” 二进制文件 打开二进制文件,读、追加 “at” 文本文件 打开文本文件,追加
“r+” 文本文件 打开文本文件,读、覆盖写 “rt+” 文本文件 打开文本文件,读、覆盖写
“w+” 文本文件 打开文本文件,先写后读 “wt+” 文本文件 打开文本文件,先写后读
“a+” 文本文件 打开文本文件,读、追加 “at+” 文本文件 打开文本文件,读、追加
三个基本模式:
“r”(read)模式总是打开一个已经存在的文件,如果文件不存在则出错。
“w”(write)模式建立一个新文件,如果文件已经存在,那么先删除存在的文件,再建立新文件。
“a”(append)打开一个存在的文件,在文件的尾部追加数据。


  • 三个追加符:
    “b”(binary)表示二进制文件。
    “t”(或默认)表示文本文件。
    “+”表示将模式扩展为可读、可写方式。

文件的一般打开方式

fopen()函数打开文件有可能失败。如用“r”模式打开不存在的文件,此时会返回一个空指针NULL。则程序无法继续输入/输出数据。故需要在打开文件时判断是否有错。

FILE *fp;
if((fp=fopen(filename,mode))==NULL)
{
   
    printf("打开文件错误!\n");
    exit(1);/*由exit函数终止程序运行。*/
}

  • 打开文件将通知编译系统3个信息:
    1.使用的文件指针
    2.需要打开的文件名
    3.使用文件的方式

文件的关闭

文件打开的目的是为了读/写,当文件使用完毕后,应当关闭文件。关闭文件的三个目的:
1.保证文件的数据不丢失,将缓冲区中的数据回写文件。
2.释放缓冲区。
3.切断文件指针与文件的关联,使关闭后的文件指针可以用于打开其他文件。
C语言定义了关闭文件的标准函数fclose。函数原型定义在头文件stdio.h中,其一般形式为:fclose(文件指针);
例如:fclose(fp);//fp是文件指针。

文件的读/写

一.字符输入/输出函数

1.字符输出函数fputc()
用法:fputc(ch,fp);
ch:输出的字符;fp:文件指针变量
功能:写一个字符到fp对应文件的当前位置上。如果调用函数成功,则返回ch的值;如果失败,则返回值EOF(系统定义的宏,值为-1);

2.字符输入函数fgetc()
用法:ch=fgetc(fp);
fp:文件指针变量
功能:从fp对应的当前位置读一个字符。如果调用成功,则返回读到的字符(赋值给ch);如果读到文件结束,则返回EOF(-1)。

3.文件结束检测函数feof()
用法:feof(fp);
fp:文件指针变量
功能:判断文件是否处于文件结束位置。如果文件结束,则返回1,否则返回0。

二.字符串输入/输出函数

1.字符串输入函数fgets()
用法:fgets(str,n,fp);
str:字符指针或数组名;n:整型量,说明输入字符串的最大长度(包括‘\0’);fp:文件指针
功能:从fp对应文件的当前位置,最多输入n-1个字符,在最后加‘\0’,之后放在str为首地址的内存中。
注意:在输入过程中,如果遇到换行符或EOF,输入即结束。函数正常调用,返回str的首地址,当出错或遇到文件结束标志时,返回NULL。

2.字符串输出函数fputs()
用法:fputs(str,fp);
str:函数参数str是字符指针或数组名;fp:文件指针
功能:将首地址是str的字符串输出到fp对应文件的当前位置,自动丢弃str后的‘\0’。函数调用成功后返回值是0,否则是EOF。
在文件使用中,可采用标准的设备文件,系统为每一个设备指定了标准的文件指针名称。
常见的标准设备文件:

文件号 文件指针 标准文件
0 stdin 标准输入设备(键盘)
1 stdout 标准输出设备(显示器)
2 stderr 标准错误设备(显示器)
3 stdaux 标准辅助设备(辅助设备端口)
4 stdprn 标准打印(打印机)

三.文件的格式化输入/输出函数

1.格式化输入函数fscanf()
用法:fscanf(fp,format,&arg1,&arg2,…,&argn);
fp:文件指针;format:格式说明字符串;&arg1…&argn:输入变量的地址列表。
功能:从fp指向的文件的当前位置,顺序读取ASCII码值,按照fomat规定的格式转化为各个变量对应的值,送入指定变量。

2.格式化输出函数fprintf()
用法:fprintf(fp,format,arg1,arg2,…,argn);
fp:文件指针;format:格式说明字符串;arg1…argn:输出参数个数表
功能:按指定的格式(format)将输出列表arg1…argn的值转换成对应的ASCII码表示形式,写入fp文件的当前位置。例如:
fprintf(fp,“%d,%x,%u”,123,145,12);

四.文件的数据块输入/输出函数

1.数据块输入函数fread()
用法:表示从文件中读入数据到内存缓冲区。形式为:fread(buf,size,count,fp);
buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。
size:无符号整型,表示一次读取的字节数。
count:无符号整型,表示读取的大小为size的块的次数。
fp:文件指针。
功能:从fp指向的文件的当前位置读区size个字节,共count次,读取的总字节数为size*count,存放到首地址为buf的内存中。读取成功则返回读取的项数count。

2.数据块输出函数fwrite()
用法:表示从内存输出数据块到文件中。其一般形式为:
fwrite(buf,size,count,fp);
buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。
size:无符号整型,表示一次写入的字节数。
count:无符号整型,表示写入的大小为size的块的次数。
fp:文件指针。
功能:从fp指向的地址开始,分count次,每次size个字节,向fp指向的文件的当前位置写数据,共写入count*size个字节。写入成功则返回读取的项数count。

fread()和fwrite()读/写的最小单位是字节,而fscanf()和fprintf()的读/写数据基本单位是以类型为单位的数据对象。so,fread()和fwrite()更适合处理二进制文件,而fscanf()和fprintf()则更适合处理的都是文本文件。

在读取二进制文件时不能用EOF作为文件标志,要用feof函数判断文件是否结束。因为-1可能是一个有效数据。

五.整数输入/输出函数
  • getw 函数(只适用于二进制文件)
    getw函数表示整数输入。一般形式为:
int a;
a=getw(fp);

功能:从fp指向的文件中读取一个整数(2字节),整数由函数返回。只使用于二进制文件。

  • putw 函数(适用于二进制文件)
    putw函数表示整数输出。其一般形式为:
putw(i,fp);

功能:将整数i输出到文件fp之中。

图书管理系统

项目功能需求

题目描述:对图书的库存信息、借阅信息和用户信息进行管理
要求:所有的基础数据均能以文件的形式存储,这些数据包括:
图书信息:图书编号、ISBN、书名、作译者、出版社、价格、复本数、库存量
用户信息:借书证号、姓名、性别、出生日期、专业
借阅信息:图书编号、借书证号、ISBN、结束时间
运行效果:
在这里插入图片描述

【1】

在这里插入图片描述
在这里插入图片描述

【2】

在这里插入图片描述

【3】

在这里插入图片描述
在这里插入图片描述

【信息保存】

在这里插入图片描述

图1 图书管理系统运行效果

知识点分析

利用链表和结构体实现
对各个功能模块进行归类整理;
掌握结构体成员的访问;
使用结构体处理复杂的数据结构;
级联菜单功能的实现。

算法思想

1.根据需求对不同功能实现进行模块分类
2.实现程序反复运行,直至用户菜单选择退出->通过无限循环反复调用start()函数使得程序运行
3.结构体的定义和辅助结构体的设计使用

系统流程图

在这里插入图片描述

图2 图书管理系统流程图

项目实现


1.#include"stdlib.h"
2.#include"string.h"
3.#include"conio.h"
4.#include"malloc.h"
5.#include"stdio.h"
6.#include"time.h"
7.#define bookpath "project 7/tuozhan/Book management system/book.dat" //图书地址
8.#define userpath "project 7/tuozhan/Book management system/user.dat"//用户地址
9.#define borrowpath "project 7/tuozhan/Book management system/borrow.dat"//借阅地址
10.#define idlen 12 //id
11.#define namelen 10 //名字
12.#define sexlen 4 //性别
 
13.typedef struct
14.{
   
 
15.int borrowid; //借书证号
16.char name[namelen + 1]; //姓名
17.char sex[sexlen + 1]; //性别
18.int born; //出生日期
19.char major[namelen + 1];//专业
 
20.}User;
 
 
 
21.typedef struct node1
22.{
   
23.User userinf;
24.struct node1* next;//单链表指针
25.}user;
 
 
 
26.typedef struct
27.{
   
 
28.char bookid[idlen + 1]; //图书编号
29.char name[namelen + 1];//图书名字
30.int ISBN;
31.char writer[namelen + 1];//作译者
32.int price;//价格
33.char press[namelen + 1];//出版社
34.int bor;//复本数
35.int now;//库存量
 
36.}Book;
 
 
37.typedef struct node2
38.{
   
39.Book bookinf;
40.struct node2* next;
41.}book;
 
42.typedef struct
43.{
   
 
44.char bookid[idlen + 1];//图书编号
45.char borrowid[idlen + 1];//借书证号
46.int ISBN;
47.char time[idlen + 1];//借书时间
48.}Bor;
 
 
49.typedef struct node3
50.{
   
51.Bor borrowinf;
52.struct node3* next;
53.}borrow;
 
 
54.static int bookmenu();//图书菜单
55.static int usermenu();//用户菜单
56.static int displaymenu();//主菜单
 
57.static void bookcreate(const char* path);图书信息的建立
 
58.static book* bookimport(FILE* fp);//读取文件的中的图书信息并且返回图书的头指针
 
59.static book* bookinput();//初始化图书信息
 
60.static void displaybook(book* head);//将所有的图书信息输出
 
61.static book* findbookId(book* head, char* id);//查询图书
 
62.static int displaybookrenew();//修改图书信息菜单
 
63.static void renewbook(book* head);//修改图书信息
 
64.static void deletebook(book* head);//删除书籍
 
65.static void addbook(book* head);//增加图书信息
 
66.static void savebook(book* head);//保存图书信息
 
67.static void booksysteam(book* bookhead);//图书信息系统
 
68.static void usercreate(char* path);//用户信息的建立
 
69.static user* userimport(FILE* fp);//读取文件的中的用户信息并且用户的头指针
 
70.static user* userinput();//初始化用户信息
 
71.static void displayuser(user* head);//用户信息输出
 
72.static user* finduserName(user* head, char* name);//查询用户名
 
73.static int displayuserrenew();//修改用户信息菜单
 
74.static void renewuser(user* head);//修改用户信息
 
75.static void deleteuser(user* head);//删除用户信息
 
76.static void adduser(user* head);//增加用户信息
 
77.static void saveuser(user* head);//保存用户信息
 
78.static void usersysteam(user* bookhead);//用户信息系统
 
79.static int borrowmenu();//借阅菜单
 
80.static void borrowcreate(const char* path);//借阅信息的建立
 
81.static borrow* borrowimport(FILE* fp);//读取文件的中的借阅信息并且借阅的头指针
 
82.static borrow* borrowinput();//初始化借阅者信息
 
83.static void displayborrow(borrow* head);//借阅信息输出
 
84.static borrow* findborrowId(borrow* head, char* id);//查询借阅信息
 
85.static int displayborrowrenew();//借阅信息输出
 
86.static void renewborrow(borrow* head);//修改借阅信息
 
87.static void deleteborrow(borrow* head);//删除图书信息
 
88.static void addborrow(borrow* head);//增加借阅信息
 
89.static void saveborrow(borrow* head);//保存借阅信息
 
90.static void borrowsysteam(borrow* borrowhead);//借阅信息系统
 
 
 
91.void BookManagemet()
92.{
   
93.int f = 0;
94.int op;//选择变量
95.book* bookhead;//图书头指针
96.user* userhead;//用户头指针
97.borrow* borrowhead;//借阅头指针
98.srand((unsigned)time(NULL));//随机数
99.bookhead = bookinput(); //读入图书信息
100.userhead = userinput(); //读入用户信息
101.borrowhead = borrowinput();//读入借阅信息
102.while (1)
103.{
   
104.op = displaymenu();//主菜单
105.switch (op)
106.{
   
107.case 1:
108.booksysteam(bookhead);
109.break;
110.case 2:
111.usersysteam(userhead);
112.break;
113.case 3:
114.borrowsysteam(borrowhead);
115.break;
116.case 0:
117.saveborrow(borrowhead);
118.savebook(bookhead);
119.saveuser(userhead);
120.f = 1;
121.break;
122.}
123.if (f == 1)
124.break;
125.}
 
 
126.}
 
127.int usermenu()//用户菜单
128.{
   
129.int op;
130.while (1)
131.{
   
 
132.system("cls");
133.printf("\n请选择操作:\n");
134.printf("--------------------------------------\n");
135.printf("(1)显示所有用户信息\n");
136.printf("(2)修改用户信息\n");
137.printf("(3)删除用户信息\n");
138.printf("(4)增加用户信息\n");
139.printf("--------------------------------------\n");
140.scanf_s("%d", &op);
141.getchar();
142.printf("\n");
143.if (op < 0 || op  > 4)
144.{
   
145.printf("\n请选择正确操作");
146.system("pause");
147.}
148.else
149.return op;
150.}
151.}
152.void usercreate(const char* path)//用户信息的建立
153.{
   
154.FILE* fp;
155.User inf;
156.int i = 1;
157.int ch;
158.errno_t err;
159.if ((err = fopen_s(&fp, path, "w")) != 0)
160.{
   
161.printf("\n无法建立新文件\n");
162.return;
163.}
164.printf("下面将输入用户信息(姓名输入$,结束):\n");
165.while (1)
166.{
   
167.printf("\n请输入第%d个用户信息: \n", i++);
168.printf("--------------------------------------\n");
169.printf("姓名(12个字符以内):\t");
170.getchar(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值