c博客06-结构体&文件
1.本章学习总结
1.1 学习内容总结
1.1.1结构体大概
-
①结构体定义:
struct 结构名
{
类型名 结构成员名1
类型名 结构成员名2
...
类型名 结构成员名n
}; -
②结构体的定义是一条语句,因此末尾需要有分号。
-
③struct是定义结构类型的关键字,在struct之后,自行命名一个结构名,struct与结构名共同组成结构类型名。
1.1.2结构变量的使用
-
①结构变量成员的引用:使用结构成员操作符“.”,格式为:结构变量名.结构成员名
-
②结构成员赋值:先使用结构成员操作符,再以该成员类型名的形式对其进行赋值,或者在相同结构类型的变量之间可直接赋值。
1.1.3结构体数组
-
①对结构数组元素成员的引用是通过使用数组下标与结构成员操作符“.”,格式为:结构数组名 [下标].结构成员名
-
②结构数组排序:先确定排序对象,然后通过结构成员操作符引用,之后便可用之前的排序方法进行排序,其中,作为交换的中间变量的类型也应是结构类型。
1.1.4结构指针
-
①结构指针就是指向结构类型变量的指针。
-
②访问结构成员有两种方法:一,用(p)访问,如 (p).num 其中,由于"."的优先级高于"",所以(p)的括号必不可少。二,用指向运算符->,如 p->num 。
1.1.5共用体
-
①共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
-
②为了定义共用体,您必须使用union语句,union 语句的格式如下:
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
1.1.6文件
-
①文件处理步骤:定义文件指针->打开文件->文件处理->关闭文件。
-
②文件打开方式:
-
文本文件(ASCII)
使用方式 | 含义 |
---|---|
“r” | 只读 |
“w” | 建立新文本,只写 |
“a” | 追加 |
“r+” | 读写 |
“w+” | 建立新文本,读写 |
“a+” | 读写,追加 |
- 二进制文件
使用方式 | 含义 |
---|---|
“rb” | 只读 |
“wb” | 建立新文本,只写 |
“ab” | 追加 |
“rb+” | 读写 |
“wb+” | 建立新文本,读写 |
“ab+” | 读写,追加 |
-
③格式,如:
FILE* fp;
fp = fopen("D:\idiom清洗版.txt", "r");
if (!fp)
{
printf("文件打开失败!\n");
exit(0);
}
while (!feof(fp))
{
对文本进行操作
}
if (fclose(fp))
{
printf("不能关闭文件!\n");
exit(0);
} -
③与文件处理有关的函数(需stdio.h)
名称 | 功能 |
---|---|
fopen() | 打开文件 |
exit() | 关闭所有打开的文件,终止程序 |
fclose() | 关闭文件 |
fgetc() | 读取文件赋予字符 |
fputc() | 将字符写入文件 |
fscanf() | 格式化文件读取 |
fprintf() | 格式化文件写入 |
fgets() | 从文件读取字符串 |
fputs() | 将字符串写入文件 |
feof() | 检测是否到文件末尾 |
rewind() | 重定位文件首地址 |
fseek() | 控制指针移动 |
ftell() | 获取指针当前位置,即字节数 |
ferror() | 检测读写是否出错 |
clearer() | 清除出错标志和文件结束标志 |
1.2 本章学习体会
1.2.1学习感受
这是最后一次博客作业了,想到自己完成了七篇博客也是怪不容易的,虽然每次写博客都很煎熬,但通过博客作业我都能重新回顾一遍课本,找到新的知识点,要期末了,我深知我在遍程方面仍有许多不足,仍需继续努力。
1.2.2代码量
代码量大约509行。
2.综合作业--“我爱成语”
2.1.文件介绍
- 头文件介绍
名称 | 说明 |
---|---|
ID结构体 | 储存用户的账号和密码 |
CY结构体 | 储存成语和意思 |
void userInterface() | 用户登录界面函数 |
void menuInterface() | 菜单界面函数 |
int checkPassword(ID *user) | 校验账号密码函数 |
void searchIdiom() | 查阅成语函数 |
void playGame() | 成语游戏函数 |
void arrangeInput(char* rawData) | 整理输入函数 |
void getDate(CY* rawLibrary) | 读取文件成语函数 |
char whetherHome(char button) | 返回按钮函数 |
2.2函数实现文件介绍
- ①main函数介绍
功能:调用登录函数及菜单函数,按照用户的输入控制整个程序的走向。
- ②登录界面函数介绍
功能:显示登录窗口,供用户输入账号密码,调用校验账号密码函数。
- ③校验账号密码函数
功能:比较用户输入的账号密码是否与文件中的账号密码一致。
- ④菜单界面函数介绍
功能:显示菜单窗口,供用户选择。
- ⑤查阅成语函数介绍
功能:调用读取文件成语函数和整理输入函数,并根据已有文件给出用户输入的成语的意思。
- ⑥读取文件成语函数介绍
功能:读取并转存文件的成语及意思
- ⑦整理输入函数介绍
功能:若用户输入的成语中含空格,将自动去除空格与换行符。
- ⑧是否返回函数介绍
功能:显示是否返回窗口,并供用户输入选项。
- ⑨成语游戏函数介绍
敬请期待!
码函数。
2.2.运行结果
- ①登录界面
- ②游戏界面
- ③排行界面
敬请期待!
- ④查阅界面
- ⑤菜单界面
2.3大作业总结
- ①碰到问题及解决办法
问题 | 说明 | 解决方法 |
---|---|---|
在菜单界面输入选项后无法进入对应的函数 | 忘了对单字符应使用'' | 将switch语句中的 1 改为 '1' |
在菜单界面输入选项后以异常的形式进入函数 | 没有吸收之前输入用户密码的换行符 | 在用户密码输入语句后补充getchar()语句 |
读取文件时,VS显示unsafe | 百度。。。 | 将VS的预处理器定义设为_CRT_SECURE_NO_WARNINGS |
死循环 | 在while循环语句之前忘了将循环变量i清零 | 将变量i清零 |
在试图从函数返回主函数的菜单函数时程序直接结束 | 从函数调用菜单函数并不会自动到主函数中的菜单函数接口且我的菜单函数是void型会直接结束程序 | 放弃调用,改为在main函数改为while语句,并用button判断是否结束循环即结束程序 |
- ②小结
虽然此次大作业我只完成了登录与查阅功能,但我对文件与结构体的使用有了直接的体会,另外我此次大作业中的函数仍有无参式的函数(因为我确实想不出让它返回啥好。。。)。这也体现了我在多函数衔接上仍有不足,仍需努力。