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.文件操作都有什么?

  1. fopen(): 用于打开文件,并返回一个指向文件的指针。
  2. fclose(): 用于关闭文件,并释放相关的资源。
  3. fgetc(): 从文件中读取一个字符。
  4. fputc(): 向文件中写入一个字符。
  5. fgets(): 从文件中读取一行文本。
  6. fputs(): 向文件中写入一行文本。
  7. fprintf(): 格式化输出到文件。
  8. fscanf(): 从文件中按照指定格式进行读取。
  9. fseek(): 设置文件指针的位置。
  10. ftell(): 获取当前文件指针的位置。
  11. rewind(): 将文件指针重置到文件开头。
  12. feof(): 检测文件是否已经达到文件结尾。
  13. remove(): 删除文件。
  14. 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进行苏格拉底挑战?

 

 

 

 

 

 

三、问题与解决思路

 

 

四、实践内容与代码链接

 

posted on 2023-09-17 19:20  20211128李杰  阅读(64)  评论(0)    收藏  举报