
文件I/O系统I/O详解1. 什么是文件I/O文件I/OInput/Output又称系统I/O或系统调用是操作系统内核提供的一组API接口函数用于应用程序与底层硬件如磁盘、设备之间的数据读写操作。核心特点无缓冲机制文件I/O不提供用户空间的缓冲每次读写都直接与内核交互直接系统调用通过操作系统内核完成性能开销相对较大底层操作提供最基础的读写能力适合需要精细控制的场景2. 文件I/O的核心API函数文件I/O提供了一组基础但强大的系统调用函数2.1 open() - 打开文件intopen(constchar*pathname,intflags,mode_tmode);功能打开或创建文件返回值成功返回文件描述符失败返回-1参数pathname文件路径flags打开方式O_RDONLY、O_WRONLY、O_RDWR等mode文件权限创建文件时使用2.2 close() - 关闭文件intclose(intfd);功能关闭已打开的文件描述符返回值成功返回0失败返回-1作用释放系统资源确保数据写入磁盘2.3 read() - 读取数据ssize_tread(intfd,void*buf,size_tcount);功能从文件描述符读取数据返回值成功返回读取的字节数0表示文件结束-1表示错误参数fd文件描述符buf数据缓冲区count要读取的最大字节数2.4 write() - 写入数据ssize_twrite(intfd,constvoid*buf,size_tcount);功能向文件描述符写入数据返回值成功返回写入的字节数-1表示错误参数fd文件描述符buf数据缓冲区count要写入的字节数3. 文件描述符详解3.1 什么是文件描述符文件描述符File Descriptor简称fd是一个非负整数是Linux/Unix系统中用于标识已打开文件的抽象概念。关键特性每个打开的文件都对应一个唯一的文件描述符Linux为程序中每个打开的文件分配一个文件描述符文件描述符从0开始分配依次递增所有文件I/O操作都通过文件描述符来完成3.2 标准文件描述符Linux系统为每个进程预定义了三个标准文件描述符文件描述符名称默认设备用途0STDIN_FILENO键盘标准输入1STDOUT_FILENO显示器标准输出2STDERR_FILENO显示器标准错误输出示例代码#includeunistd.h#includestdio.hintmain(){// 使用标准文件描述符charbuffer[100];write(STDOUT_FILENO,请输入内容,13);read(STDIN_FILENO,buffer,sizeof(buffer));write(STDOUT_FILENO,你输入的是,13);write(STDOUT_FILENO,buffer,sizeof(buffer));return0;}4. 文件I/O与标准I/O的区别特性文件I/O系统I/O标准I/O库I/O缓冲机制无缓冲有缓冲全缓冲、行缓冲、无缓冲性能每次调用都进入内核开销大缓冲减少系统调用性能更好函数前缀无open、read、write带ffopen、fread、fwrite错误处理通过errno和返回值通过errno和返回值适用场景设备文件、网络套接字、需要精细控制普通文件、需要高性能读写5. 文件I/O的典型使用流程#includefcntl.h#includeunistd.h#includestdio.h#includeerrno.h#includestring.hintmain(){intfd;charbuffer[1024];ssize_tbytes_read,bytes_written;// 1. 打开文件fdopen(example.txt,O_RDWR|O_CREAT,0644);if(fd-1){perror(打开文件失败);return1;}// 2. 写入数据char*dataHello, File I/O!\n;bytes_writtenwrite(fd,data,strlen(data));if(bytes_written-1){perror(写入失败);close(fd);return1;}// 3. 移动文件指针到开头准备读取lseek(fd,0,SEEK_SET);// 4. 读取数据bytes_readread(fd,buffer,sizeof(buffer)-1);if(bytes_read-1){perror(读取失败);close(fd);return1;}buffer[bytes_read]\0;// 添加字符串结束符// 5. 输出读取的内容write(STDOUT_FILENO,读取的内容,13);write(STDOUT_FILENO,buffer,bytes_read);// 6. 关闭文件if(close(fd)-1){perror(关闭文件失败);return1;}return0;}6. 常见错误处理文件I/O操作必须进行错误检查intfdopen(file.txt,O_RDONLY);if(fd-1){// 错误处理perror(open failed);fprintf(stderr,错误代码%d\n,errno);// 根据errno进行特定处理if(errnoENOENT){fprintf(stderr,文件不存在\n);}elseif(errnoEACCES){fprintf(stderr,权限不足\n);}return1;}