文件
学习目的
我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。
知识点
- 打开文件;
1.1 查找文件地址;
1.2 mode 文件的操作模式; - 写入数据;
- 读取数据;
- 关闭文件.
知识点详解
- 打开文件
FILE *fp;
fopen_s(&fp,"C:/Users/MACHENIKE/Desktop/abc.txt", "r");
1.1 查找文件地址:
- 右键 - 运行 - cmd - 终端 - 拖一个文件到终端
- win + r
- C:\Users\MACHENIKE\Desktop\abc.txt
- /Users/MACHENIKE/Desktop/abc.txt
1.2 mode 文件的操作模式:
- r 只读 文件不存在就报错 从头开始读
- w 只写 文件不存在就创建 从头开始写
- a 只写 从末尾开始写
- r+ w+ a+ 可读可写
- 写入数据
FILE *fp;
fopen_s(&fp,"C:/Users/MACHENIKE/Desktop/abc.txt", "w");
//音频 视频 图片 -> 二进制数据
//fputs("abc", fp);
struct Student {
char name[10];
int age;
};
Student xw1 = {"xiaowang", 20};
//将结构体写到文件里面去
fwrite(&xw1, sizeof(struct Student), 1, fp);
fclose(fp);
运行之后会将name和age写入文件,若没有找到文件会新建一个文件再写入。
- 读取数据
FILE *fp;
fopen_s(&fp,"C:/Users/MACHENIKE/Desktop/abc.txt", "r");
//char temp[20] = {};
//fgets(temp, 5, fp);
//printf("%s\n",temp);
struct Student xw1;
fread(&xw1, sizeof(struct Student), 1, fp);
printf("name: %s\n", xw1.name);
printf("age: %d\n", xw1.age);
fclose(fp);
运行之后读取打印出来。
- 关闭文件
fclose(fp);
练习
学生信息管理
/*
1. 读取文件内容
内容是什么: 学生信息 -> 结构体
怎么存储:数组 不是最优解
链表 是最优解
线性表 栈 单链表 双链表 二叉树树 图 哈希表
2. 显示界面
Update Delete Insert Select
3. 保存数据
*/
//定义一个学生的结构体节点
typedef struct Node{
char name[10];
int _id;
float score;
struct Node *next;
} Student;
//初始化一个头结点
void initHeader(Student **pHeader){
//动态分配内存
Student *pTemp = malloc(1 * sizeof(Student));
//初始化
pTemp->next = NULL;
//改变外部的值
*pHeader = pTemp;
}
void showMenu(void){
printf("************\n");
printf("1.查询\n");
printf("2.删除\n");
printf("3.更改\n");
printf("4.插入\n");
printf("5.退出\n");
printf("************\n");
}
int getChoice(void){
int c;
printf("请选择操作:");
scanf("%d", &c);
return c;
}
void MyExit(int status){
printf("**************\n");
printf("感谢你的使用再见\n");
printf("**************\n");
//保存数据
}
void save(Student *pTemp){
}
void insert(Student *pTemp){
//准备一个结构体 保存数据
Student *pStu = malloc(1 * sizeof(Student));
pStu->next = NULL;
//提示用户输入
printf("请输入姓名:");
scanf("%s", pStu->name);
printf("请输入成绩:");
scanf("%f", &(pStu->score));
//插入
int count = 0;
while (pTemp -> next != NULL) {
pTemp = pTemp->next;
count++;
}
//自动编号
pStu->_id = count+1;
//将当前这个学生添加到最后一个节点就可以了
pTemp->next = pStu;
}
void querry(Student *pTemp){
//指向第一个数据节点
pTemp = pTemp -> next;
while (pTemp != NULL ) {
printf("id:%d\n", pTemp->_id);
printf("name:%s\n", pTemp->name);
printf("score:%.1f\n",pTemp->score);
printf("\n");
pTemp = pTemp->next;
}
}
int main(int argc, const char * argv[]) {
//定义一个指针 记录头结点
Student *pHeader = NULL;
//初始化头结点
initHeader(&pHeader);
int choice = 0;
while(1){
showMenu();
choice = getChoice();
switch (choice) {
case 1:
//查询
querry(pHeader);
break;
case 2:
break;
case 3:
break;
case 4:
//插入
insert(pHeader);
printf("插入成功!!!\n");
break;
default:
MyExit(EXIT_SUCCESS);
break;
}
}
return 0;
}
感悟
第五天的学习内容比较多,从夸张的指针到取巧的结构体再到抽象的文件最后到看也看不懂的练习,导致第五天同样是懵懂的一天。而我现在能做的就只有大量的练习,勤能补拙吧。就算是抄代码,也要抄出一片天地。同样在学习中我也发现了很多很多的“坑”,比如指针与++,--的结合、结构体的对齐以及文件中的一些小技巧。而我们应当注意的是这些“坑”,说他是“坑”,还不如说他是“提分点”,因为掌握他们你在考试、面试他们便是你独特的魅力,推动你走向人生的巅峰。所以绊脚石不一定总是绊脚石,只有用好他,他便是垫脚石。