1.7 文件IO1

preview
需积分: 0 0 下载量 39 浏览量 更新于2022-08-03 收藏 324KB PDF 举报
在计算机编程中,文件输入/输出(IO)是程序与磁盘存储交互的关键部分。本文将深入探讨在标准C库中的文件IO函数以及Linux系统IO的相关知识点。 `fflush`函数用于刷新缓冲区。当我们在进行文件操作时,数据通常会先被存储在内存的缓冲区中,而不是直接写入磁盘。`fflush`可以确保缓冲区中的内容被立即写入文件,防止数据丢失。在某些情况下,如程序异常终止,未刷新的缓冲区数据可能会丢失。 缓冲区满的情况通常发生在使用缓冲IO时,例如`fread`和`fwrite`。当缓冲区达到其最大容量(默认通常是8192字节)时,需要清空缓冲区以继续读写操作。这可以通过`fflush`来实现,或者在某些情况下,如调用`fclose`时,系统会自动刷新缓冲区。 正常关闭文件是非常重要的,有三种常见方式: 1. 使用`fclose`函数显式关闭文件。 2. 在`main`函数返回时,系统会关闭所有打开的文件。 3. 使用`exit`函数退出程序时,也会关闭文件。 在标准C库中,`fopen`函数用于打开文件,并返回一个`FILE`指针,该指针代表文件描述符,用于后续的读写操作。`fclose`用于关闭文件,`fread`和`fwrite`则分别用于读写文件内容。`fseek`用于改变文件读写指针的位置,`ftell`返回当前指针位置,而`feof`检查是否到达文件末尾。 在Linux系统IO中,文件描述符是一个整数值,用来标识进程打开的文件。例如,0表示标准输入,1表示标准输出,2表示标准错误。每次打开新的文件,都会分配一个新的、最小的空闲文件描述符。`open`函数用于打开文件,`close`关闭文件描述符,`read`和`write`分别用于读写文件内容,`lseek`改变文件偏移量,`stat`获取文件的元信息。 虚拟地址空间是操作系统为每个进程提供的抽象内存模型,包括受保护的内核空间和用户空间。代码段(`.text`)、数据段(`.data`、`.bss`)以及堆和栈空间都在用户空间内,而内核空间存储了操作系统核心、设备驱动和虚拟文件系统(VFS)等。 在文件描述符表中,每个进程都有自己的独立表,记录着与文件相关的状态。例如,`/dev/tty`表示当前终端,且标准输入、输出和错误默认都有对应的文件描述符。 `struct stat`结构体包含了关于文件的各种信息,如设备号、节点号、文件权限、大小、访问时间等。其中,`st_mode`字段用于描述文件的类型和权限,如S_IFREG表示普通文件,S_IFLNK表示符号链接,而S_IRUSR、S_IWUSR、S_IXUSR等位标识了用户对文件的读、写、执行权限。 文件IO涉及到从用户空间的缓冲区到内核空间的I/O操作,再到磁盘的物理读写。理解这些概念对于编写可靠的文件处理程序至关重要。在标准C库和Linux系统接口之间,开发者可以灵活地控制数据的读写和文件管理,以满足各种应用需求。