《信息安全系统设计与实现》第二周学习笔记
《信息安全系统设计与实现》第二周学习笔记
第九章 I/O库函数
系统调用函数
- 系统调用
- 系统调用函数
- open():打开和创建文件
- read():读文件
- write():写文件
- lseek()
- close()
- I/O库函数
- fopen():以指定的形式打开文件
- fread():从给定流 stream 读取数据到 ptr 所指向的数组中
- fwrite():把 ptr 所指向的数组中的数据写入到给定流 stream 中
- fseek():
- fclose():关闭流 stream,刷新所有的缓冲区
- 系统调用函数
- I/O库函数的算法
- fread算法:
- 第一次调用fread()时候,FILE结构体的缓冲区是空的,fread()使用保存的文件描述符fd发出一个
n =read(fd, fbuffer, BLKSIZE);
- 在随后的每次fread()的调用中,它都尝试满足来自FILE结构体内部缓冲区的调用
- 与fread相似,但数据传输方向不同
- 第一次调用fread()时候,FILE结构体的缓冲区是空的,fread()使用保存的文件描述符fd发出一个
- fclose算法:
- 若以写的方式打开文件,fclose会先关闭文件流的局部缓冲区。然后发出一个close(fd)系统调用来关闭FILE结构体中的文件描述符。最后,释放FILE结构体,并将FILE指针重置为NULL
- fread算法:
- I/O库模式
- fopen()
- r:读
- w: 写
- a:追加
- r+:读/写,不会截断文件
- w+:读/写,会先截断文件;如果文件不存在,会创建文件
- a+:通过追加进行读/写;如果文件不存在,会创建文件
- 字符模式I/O
- int fgetc(FILE *fp);
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。 - int ungetc(int c, FILE *fp);
如果成功,则返回被推入的字符,否则返回 EOF,且流 stream 保持不变。 - int fputc(int c, FILE *fp);
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
- int fgetc(FILE *fp);
- 大小写转换实践:
- 行模式I/O
char *fgets(char *buf, int size, FILE *fp);
:从fp中读取最多的为一行(以\n结尾)的字符int fputs(char *buf,FILE *fp);
:将buf的一行写入fp中
- 格式化I/O
- 格式化输入:
scanf(char *FMT,&items); fscanf(fp, char *FMT,&items);
- 格式化输出:
printf(char *FMT,items); fprintf(fp,char *FMT,items);
- 格式化输入:
- 内存中的转换函数
sscanf(buf,FMT,&items); sprintf(buf, FMT, items);
- 其他I/O库函数
- fseek()、ftell()、rewind():更该文件流中的读/写字节位置
- feof()、ferr()、fileno():测试文件流状态
- fdopen():用文件描述符打开文件流
- freopen():以新名称重新打开现有的流
- setbuf()、setvbuf():设置缓冲方案
- popen():创建管道,复刻子进程来调用sh
- 限制混合fread-fwrite
- 当某文件同时进行读、写操作时,会限制混合使用fread()和fwrite(),注意两者之间至少有一个fseek()或者ftell()
- fopen()
- 文件流缓冲
- 无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输
- 行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输
- 全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文件流的正常缓冲方案。
- 变参函数
- 多种类型的可变数量参数都可以调用它
苏格拉底挑战:
遇到的问题
- 在理解write()、lseek()函数有一些偏差
- 解决过程:询问GPT后得知write函数是将数据从用户提供的缓冲区写入到指定的文件描述符中而不是指定的文件,lseek函数是设置文件的偏移量。