信息安全系统设计与实现课程第九章课程笔记

1.笔记内容

9.1 I/O库函数

I/O库函数是在C和C++编程中广泛使用的文件操作函数,用于进行输入和输出操作。它们是构建在系统调用之上的高级接口,提供了更方便和高效的文件操作方法。

9.2 I/O库函数与系统调用

在了解I/O库函数之前,我们首先需要了解系统调用,因为I/O库函数在内部依赖于系统调用。系统调用是操作系统提供的底层文件操作接口,主要包括以下函数:

open():用于打开文件。
read():用于从文件读取数据。
write():用于向文件写入数据。
lseek():用于设置文件读/写指针的位置。
close():用于关闭文件。
I/O库函数是建立在系统调用之上的,它们包括:

fopen():用于打开文件并返回一个文件指针。
fread():用于从文件中读取二进制数据。
fwrite():用于向文件中写入二进制数据。
fseek():用于在文件中移动读/写指针的位置。
fclose():用于关闭文件。
这些函数提供了更高级别的抽象,使文件操作更容易管理和使用。

9.3 I/O库函数的算法

I/O库函数背后有不同的实现算法,下面我们简要介绍其中一些:

fread()算法:fread()函数从用户程序接收调用,同时向操作系统内核发出read()系统调用,以从文件中读取一定数量的数据,并将读取的数据存储到指定的内存位置中。

fwrite()算法:与fread()类似,但数据传输方式不同。当结构体缓冲区为空时,调用fwrite()将数据写入内部缓冲区,并调整缓冲区指针、计数器和状态变量,跟踪缓冲区字节数。当缓冲区满时,发出write()系统调用,将整个缓冲区写入操作系统内核。

fclose()算法:如果文件以写入方式打开,fclose()首先关闭文件流的局部缓冲区,然后发出close(fd)系统调用来关闭FILE结构体中的文件描述符,最终释放结构体并将指针重置为NULL。

9.4使用I/O库函数或系统调用

在使用文件时,你可以选择使用I/O库函数或系统调用,具体取决于你的需求。下面是一些关于文件操作的常见用法:

fopen()中的模式参数可以指定为:"r"、"w"、"a",分别代表读、写、追加。每个模式字符串可以包含一个+号,表示同时读和写,或者在写入或追加时,如果文件不存在,则创建文件。

"r+"表示读/写,不会截断文件。

"w+"表示读/写,但会先截断文件;如果文件不存在,会创建文件。

"a+"表示通过追加进行读/写;如果文件不存在,会创建文件。

9.5 I/O模式库

除了二进制模式的I/O,C语言还提供了字符模式I/O函数,用于以字符为单位进行文件操作。以下是一些常见的字符模式I/O函数:
int fgetc(FILE *fp):从文件中读取一个字符并返回其ASCII码值。通常,EOF(文件结束符)用于表示文件的末尾。
int ungetc(int c, FILE *fp):将之前通过fgetc()获取的字符重新放回流中,以便之后再次读取。
int fputc(int c, FILE *fp):将字符写入文件中。

这些函数通常用于文本文件的读取和写入操作,而不是二进制数据。
除了上述函数外,还有一些其他有用的I/O库函数,包括:
fseek()、ftell()、rewind():用于更改文件流中的读/写字节位置和获取当前位置,以及将文件指针重置为文件的开头。
feof()、ferror()、fileno():用于测试文件流的状态,检查文件是否到达末尾或发生错误,以及获取文件描述符。
fdopen():用于使用文件描述符打开文件流。
freopen():以新名称重新打开现有的流。
setbuf()、setvbuf():用于设置文件流的缓冲方案。
popen():用于创建管道,复刻子进程来调用shell。

9.6 文件流缓冲

文件流可以有不同的缓冲模式,包括:

无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。例如,文件流stderr通常是无缓冲的,所有输出都会立即发送。

行缓冲:当遇到换行符时,写入行缓冲流的字符以块的形式传输。例如,文件流stdout通常是行缓冲的,逐行输出数据。

全缓冲:写入全缓冲流或从中读取的字符以块的大小传输到文件或从文件中传输。这是文件流的默认缓冲方案。

通过调用setvbuf(FILE *stream, char *buf, int mode, size_t size),你可以在使用fopen()创建文件流后设置缓冲区、缓冲区大小和缓冲模式。常见的缓冲模式包括_IONBF(无缓冲)、_IOLBF(行缓冲)和_IOFBF(全缓冲)。

9.7 变参函数

在I/O库函数中, printf()相当独特,因为多种不同类型的可变数量参数可以调用它。C语言和C++仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点。

2.问题解决

在使用文件函数将文档1内容复制到文档2的过程中,发现文档2不仅没有复制上文档1的内容,反而难以打开,后检查代码发现判断条件涉及到换行符\n,但是文档1的最后我没有加入换行符,程序也就无法终止,导致报错。再处理完该问题后,文档2成功复制文档1的内容。过程截图如下:

文档1的内容:

代码:

运行代码前文档2:

运行代码后的文档2:

3.实践

实践课本上将小写字母改成大写字母的题目:
文档1内容还是和刚才一样,为20211210wyx
具体代码:

运行代码:

运行代码后文档2成功将文档1的小写字母改成大写,实践成功:

4.ChatGpt提问

5.代码托管

上述实践的代码已托管至gitee,具体为111.txt。
仓库链接为:
https://gitee.com/wang-yuxuan333/123.git

posted @ 2023-09-13 16:38  20211210王宇轩  阅读(19)  评论(0编辑  收藏  举报