2023-2024-1 20211306 密码系统设计与实现课程学习笔记2
20211306 密码系统设计与实现课程学习笔记2
学习任务详情
自学教材第九章,提交学习笔记
- 本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
文本文件中考虑字符读写,行读写,任意位置读写等
文件操作都有什么?
二进制文件和文本文件如何转换?
数据结构如何读写?
...- 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
- 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
- 实践过程截图,代码链接(2分)
- 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
一、第九章(I/O库函数)学习总结
-
I/O库函数是一系列文件操作函数,系统调用是文件操作的基础,但他们只支持数据块的读/写。
-
I/O库函数与系统调用
在Unix/Linux中,I/O库函数建立在系统调用的基础上
- 系统调用函数:open()、read()、write()、lseek()、close();
- I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()。
左侧是系统调用程序,右侧是I/O库函数的类似程序
- 左侧的fd是一个整数,右侧的fp是一个文件流指针
- 左侧open()打开或读取文件,返回的是整数描述符,右侧fopen()返回的是FILE结构体指针
- 左侧用while读写文件,将字符装入buf[],而右侧用fgetc(fp)从文件流中获取字符,通过putchar()输出字符。
- I/O库函数算法
+fread算法
系统调用,将数据复制到程序的缓冲区,更新缓冲区的指针和计数器等
在每次进行fread()调用时,它都尝试满足来自FILE结构体内部缓冲区的调用,一方面接受用户程序的调用,一方面像操作系统内核发出read()系统调用。他只在需要时才会进入操作系统内核,并且以一种最高效匹配文件的方式进入。
- fwrite算法
与fread()算法相似,只是传输方向不同,它将数据写进内部缓冲区。
- fclose算法
若文件以写的方式被打开,fclose()会先关闭文件流的局部缓冲区,会发出close(fd)系统调用关闭FILE结构体的文件描述符,最后释放FILE结构体。
+I/O库模式
fopen()中的模式参数可指定为:“r”、“w”、“a”,代表读、写、追加。
在每个模式字符串后可加一个"+",分别表示:读/写,不会截断文件;读/写,但会先截断文件,如果文件不存在会创建文件;通过追加进行读/写,如果文件不存在,会创建文件
+字符模式
fget()返回的是整数,而不是字符
- 行模式I/O
- 格式化I/O
- 其他I/O库函数
- 文件缓冲流
每个文件流都有一个FILE结构体,其中包含一个内部缓冲区,文件流可以使用三种缓冲方案的一种
- 无缓冲:从非缓冲流中写入或读取的字符单独传播到文件或从文件中传输。
- 行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输。
- 全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。
- 实际操作
先是创建文件并写入
点击查看代码
#include <stdio.h>
int main() {
FILE *file = fopen("io.txt", "w");
/*写入模式*/
if (file == NULL) {
perror("打开文件失败");
return 1;
}
fprintf(file, "Hello world!\n");
fprintf(file, "你好 世界 欢迎来学习I/O\n");
/*写入数据到文件*/
printf("已写入");
fclose(file); /*关闭文件*/
return 0;
}
其实这里的“w”可能用“w+”更好一些,因为“w+”代表文件不存在则创建文件,但是实际使用的时候,先用“w”也能创造出来文件
询问了gpt,他的回答如上图
然后是读取
点击查看代码
#include <stdio.h>
int main() {
FILE *file = fopen("io.txt", "r");
/*读取文件*/
if (file == NULL) {
perror("打开文件失败");
return 1;
}
char buf[100];
while (fgets(buf, sizeof(buf), file) != NULL)
{
printf("%s", buf);
}
/*打印出文件内容*/
fclose(file);
return 0;
}
然后是追加内容
二、苏格拉底提问GPT
三、linux代码运行
-
生成动态库
-
gdb调试
输入fs cmd可进入文本框中
输入list可以将代码全部打印
输入 b空格“数字”可以设置断点
输入r可以跑代码跑到断点,输入n可进行逐步运行
四、问题解决