20211128李杰《信息安全系统设计与实现》第九章学习笔记
一、任务详情
自学教材第九章,提交学习笔记(10分)
本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
文本文件中考虑字符读写,行读写,任意位置读写等
文件操作都有什么?
二进制文件和文本文件如何转换?
数据结构如何读写?
...
评分标准如下
1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
2. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
3. 实践过程截图,代码链接(2分)
4. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
二、知识点归纳以及自己最有收获的内容
1.文件操作都有什么?
- fopen(): 用于打开文件,并返回一个指向文件的指针。
- fclose(): 用于关闭文件,并释放相关的资源。
- fgetc(): 从文件中读取一个字符。
- fputc(): 向文件中写入一个字符。
- fgets(): 从文件中读取一行文本。
- fputs(): 向文件中写入一行文本。
- fprintf(): 格式化输出到文件。
- fscanf(): 从文件中按照指定格式进行读取。
- fseek(): 设置文件指针的位置。
- ftell(): 获取当前文件指针的位置。
- rewind(): 将文件指针重置到文件开头。
- feof(): 检测文件是否已经达到文件结尾。
- remove(): 删除文件。
- rename(): 重命名文见。
2.二进制文件和文本文件如何转换?
1.从文本文件读取并写入到二进制文件:
使用fopen()函数打开文本文件和二进制文件,分别指定读取("r")和写入("wb")的模式。
使用文本文件的读取函数(如fgets()或fscanf())读取数据,并使用二进制文件的写入函数(如fwrite())将数据写入到二进制文件中。
最后,使用fclose()函数关闭文本文件和二进制文件。
cCopy Code
FILE *textFile = fopen("input.txt", "r");
FILE *binaryFile = fopen("output.bin", "wb");
// 从文本文件读取并写入到二进制文件
char buffer[100];
while (fgets(buffer, sizeof(buffer), textFile) != NULL) {
fwrite(buffer, sizeof(char), strlen(buffer), binaryFile);
}
fclose(textFile);
fclose(binaryFile);
2.从二进制文件读取并写入到文本文件:
使用fopen()函数打开二进制文件和文本文件,分别指定读取("rb")和写入("w")的模式。
使用二进制文件的读取函数(如fread())读取数据,并使用文本文件的写入函数(如fprintf()或fputs())将数据写入到文本文件中。
最后,使用fclose()函数关闭二进制文件和文本文件。
cCopy Code
FILE *binaryFile = fopen("input.bin", "rb");
FILE *textFile = fopen("output.txt", "w");
// 从二进制文件读取并写入到文本文件
char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), binaryFile);
fprintf(textFile, "%s", buffer);
fclose(binaryFile);
fclose(textFile);
3.数据结构如何读写?
1.数组(Array):数组是一种线性数据结构,可以通过索引直接访问其中的元素。读取数组元素的时间复杂度为O(1),即常数时间。写入数组元素也是通过索引进行,同样时间复杂度为O(1)。
2.链表(Linked List):链表由节点组成,每个节点包含数据和指向下一个节点的指针。对于单向链表,要读取或写入特定位置的元素,需要从头节点开始逐个遍历,直到找到目标节点。因此,链表的读取和写入操作的时间复杂度为O(n),其中n是链表的长度。
3.栈(Stack):栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。读取栈顶元素的时间复杂度为O(1),写入元素也是在栈顶进行,同样时间复杂度为O(1)。
4.队列(Queue):队列是一种先进先出(FIFO)的数据结构,只能在队尾插入元素,在队首删除元素。读取队首元素的时间复杂度为O(1),写入元素也是在队尾进行,同样时间复杂度为O(1)。
5.哈希表(Hash Table):哈希表是基于哈希函数实现的数据结构,通过将键映射到数组索引来存储和访问元素。哈希表的读取和写入操作的平均时间复杂度为O(1),最坏情况下可能达到O(n)。
6.树(Tree):树是一种非线性数据结构,包含根节点和若干子树。根据树的具体类型,读写操作的方式会有所不同。例如,二叉搜索树可以通过比较节点的值来进行读取和写入操作,时间复杂度为O(log n),其中n是树中节点的总数。
7.图的读写操作:
(1)添加节点(Add Node):向图中添加新的节点。
(2)添加边(Add Edge):在图的两个节点之间添加一条边。
(3)删除节点(Delete Node):从图中删除指定的节点及其相关的边。
(4)删除边(Delete Edge):从图中删除指定的边。
(5)遍历图(Traverse Graph):通过深度优先搜索(DFS)或广度优先搜索(BFS)等算法,遍历图中的所有节点。
8.堆的读写操作:
(1)插入元素(Insert):将新的元素插入到堆中,并调整堆的结构,以维持堆的性质。
(2)删除顶部元素(Delete Top):删除堆顶部的元素,并调整堆的结构,以维持堆的性质。
(3)查找顶部元素(Find Top):获取堆顶部的元素,即最大值或最小值,具体取决于堆的类型。
(4)更新元素(Update):更新堆中的某个元素的值,并调整堆的结构,以维持堆的性质。
4.用chatgpt进行苏格拉底挑战?





三、问题与解决思路


四、实践内容与代码链接



浙公网安备 33010602011771号