2023-2024-1 20211306 密码系统设计与实现课程学习笔记2

20211306 密码系统设计与实现课程学习笔记2

学习任务详情

自学教材第九章,提交学习笔记

  1. 本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
    文本文件中考虑字符读写,行读写,任意位置读写等
    文件操作都有什么?
    二进制文件和文本文件如何转换?
    数据结构如何读写?
    ...
  2. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

  1. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
  2. 实践过程截图,代码链接(2分)
  3. 其他(知识的结构化,知识的完整性等,提交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可进行逐步运行


四、问题解决





posted @ 2023-09-17 22:07  20211306丁文博  阅读(9)  评论(0编辑  收藏  举报