------------恢复内容开始------------
I/O库函数
一、库函数基本内容
- 系统调用函数:open()、read()、write()、lseek()、close();
- I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()
- 在系统调用中,文件描述符fd是一个整数,在库I/O中,fp是一个文件流指针。
-
fopen()发出open()系统调用用以获取文件描述符fd,在失败时返回一个null指针。
二、I/O库函数的算法
- fread算法。
- 在第一次调用ferad()时候,file结构体缓冲区是空的,fread()使用保存的文件描述符fd发出一个n=read(fd,fbuffer,BLKSIZE);系统调用,用数据块填充内部的fbuff[]。然后,它会初始化 fbuf[]的指针、计数器和状态变量,以表明内部缓冲区中有一个数据块。接着,通过将数据复制到程序的缓冲区,尝试满足来自内部缓冲区的fread()调用。如果内部缓冲区没有足够的数据,则会再发出一个read()系统调用来填充内部缓冲区,将数据从内部缓冲区传输到程序缓冲区,直到满足所需 的字节数(或者文件无更多数据)。将数据复制到程序的缓冲区之后,它会更新内部缓冲区的指针、计数器等,为下一个fread()请求做好准备。然后,它会返回实际读取的数据对象数量。
-
在随后的每次fread()调用中,它都尝试满足来自FILE 结构体内部缓冲区的调用。 当缓冲区变为空时,它就会发出 read()系统调用来重新填充内部缓冲区。因此,fread()一方 面接受来自用户程序的调用,另一方面向操作系统内核发出 read()系统调用。除了read()系 统调用之外,所有fread()处理都在用户模式映像中执行。它只在需要时才会进入操作系统 内核,并且以一种最高效匹配文件的方式进入。它会提供自动缓冲机制,因此用户程序不必 担心这些其体操作。
- fwrite算法。
- fwrite()算法与fread()算法相似,只是数据传输方向不同。最开始, FILE 结构体的内 部缓冲区是空的。在每次调用fwrite()时,它将数据写人内部缓冲区,并调整缓冲区的指 针、计数器和状态变量,以跟踪缓冲区中的字节数。如果缓冲区已满,则发出 write()系统调用,将整个缓冲区写入操作系统内核。
- fclose算法
-
若文件以写的方式被打开, fclose()会先关闭文件流的局部缓冲区。然后,它会发出一 个close(fd)系统调用来关闭FILE结构体中的文件描述符。最后,它会释放FILE结构体, 并将FILE指针重置为NULL。
三、I/O库模式
- 字符模式I/O
- 行模式I/O
- 格式化I/O
四、文件流缓冲
- 无缓冲
- 行缓冲
- 全缓冲2023-09-172023-09-172023-09-172023-09-172023-09-17
------------恢复内容结束------------
标签:文件,调用,第九章,fread,笔记,学习,read,09,缓冲区 From: https://www.cnblogs.com/adbl/p/17709713.html