linux标准IO和文件IO函数

📅 2026/8/12 15:19:19
linux标准IO和文件IO函数
一 .文件IO系列第一组文件属性获取stat/fstat/lstat头文件#include sys/stat.h#include unistd.h1.int stat(const char *pathname, struct stat *statbuf);功能通过文件路径获取文件属性会追踪软链接指向源文件。参数pathname字符串要查询的文件路径如./test.txt。statbuf输出型参数指向struct stat结构体的指针。内核会把文件大小、权限、时间等信息填充到这个结构体中。返回值成功返回0失败返回-1并设置errno。2.int fstat(int fd, struct stat *statbuf);功能通过文件描述符获取文件属性无需路径。参数fd已打开的文件描述符由open返回。statbuf同上输出型参数。返回值成功返回0失败返回-1。3.int lstat(const char *pathname, struct stat *statbuf);功能通过文件路径获取文件属性不会追踪软链接查的是链接文件本身不是它指向的目标。参数同stat。返回值成功返回0失败返回-1。第二组目录流操作opendir/readdir/closedir头文件#include dirent.h4.DIR *opendir(const char *name);功能打开一个目录建立目录流相当于针对目录的open。参数name目录路径字符串如.当前目录/home。返回值成功返回目录流指针DIR*失败返回NULL并设置errno。5.struct dirent *readdir(DIR *dirp);功能从已打开的目录流中逐条读取下一个目录项一个文件或子目录。参数dirp由opendir返回的目录流指针。返回值成功返回指向struct dirent结构体的指针该结构体里有文件名d_name读到末尾或出错时返回NULL用errno区分是结束还是出错。重要细节每调用一次自动往后移一个条目。6.int closedir(DIR *dirp);功能关闭目录流释放相关资源。参数dirp要关闭的目录流指针。返回值成功返回0失败返回-1。第三组文件描述符复制dup/dup2头文件#include unistd.h7.int dup(int oldfd);功能复制一个文件描述符。新描述符指向内核中同一个文件对象共享偏移量和锁。参数oldfd要被复制的旧文件描述符。返回值成功返回新的文件描述符系统自动分配当前最小的可用数字失败返回-1。8.int dup2(int oldfd, int newfd);功能复制oldfd但强制把newfd作为新的副本编号。如果newfd已被打开内核会先静默关闭它再让它指向oldfd的文件对象。参数oldfd旧文件描述符。newfd你指定的新文件描述符编号如1。返回值成功返回newfd失败返回-1。第四组文件控制万能锁fcntl头文件#include fcntl.h#include unistd.h9.int fcntl(int fd, int cmd, ... /* arg */);功能对已打开的文件描述符执行各种控制操作修改标志、复制 fd、加锁等。这是一个可变参数函数。参数fd要操作的文件描述符。cmd操作命令必填常见取值F_GETFL获取文件状态标志如是否阻塞。此时不需要第三个参数。F_SETFL设置文件状态标志。此时第三个参数arg必须传入新的标志如O_NONBLOCK。F_DUPFD复制 fd此时第三个参数arg指定新 fd 的最小可用数字类似dup的加强版。F_SETLK/F_SETLKW设置记录锁此时第三个参数必须是struct flock*指针。...arg可选取决于cmd。返回值取决于cmdF_GETFL成功返回标志值整数其他命令成功返回0统一失败返回-1。第五组删除目录项unlink头文件#include unistd.h10.int unlink(const char *pathname);功能从文件系统中删除一个名字目录项。当文件的硬链接数减为 0 且没有进程打开它时磁盘空间才会被释放这是rm命令的底层实现。参数pathname要删除的文件路径字符串。返回值成功返回0失败返回-1。第六组检查文件权限access头文件#include unistd.h11.int access(const char *pathname, int mode);功能以调用进程的真实用户 ID 和组 ID来检查对文件的访问权限常用于在真正open前做预判。参数pathname文件路径。mode要检查的权限位只能传以下宏之一F_OK检查文件是否存在。R_OK检查是否可读。W_OK检查是否可写。X_OK检查是否可执行。返回值允许满足权限返回0拒绝不满足或出错返回-1。第七组截断/扩展文件大小truncate/ftruncate头文件#include unistd.h#include sys/types.h12.int truncate(const char *path, off_t length);功能通过文件路径将文件大小设置为length字节。如果原文件大于length尾部被丢弃小于length文件被扩展中间会形成“空洞”不占物理磁盘空间。参数path文件路径字符串。length目标长度字节数off_t类型。返回值成功返回0失败返回-1。13.int ftruncate(int fd, off_t length);功能通过文件描述符将文件大小设置为length字节功能同truncate但操作的是已打开的文件。注意该文件必须以可写方式打开O_WRONLY或O_RDWR。参数fd已打开的文件描述符。length目标长度。返回值成功返回0失败返回-1。二 . 标准IO系列第一组状态判断feof/ferror/clearerr头文件#include stdio.h1.int feof(FILE *stream);作用检查文件流是否到达了文件末尾。参数stream—— 文件流指针。返回值如果已到达文件末尾返回非零值真否则返回0假。陷阱feof不会在刚读完最后一个字符时返回真而是在你尝试越过末尾再读一次后才会返回真。所以千万不要用它来做循环终止条件正确姿势是while(fread(...) 0)循环结束后再判断feof。2.int ferror(FILE *stream);作用检查文件流是否发生了 I/O 错误。参数stream—— 文件流指针。返回值如果发生了错误返回非零值真否则返回0假。场景当fread或fgetc返回异常值时用ferror区分“读到末尾”和“读取出错”。3.void clearerr(FILE *stream);作用清除文件流的文件结束标志EOF和错误标志。参数stream—— 文件流指针。返回值无void。场景当你处理完一个错误或者用rewind重置位置后需要手动清除标志否则后续的读写操作会被阻塞。第二组大文件位置控制fgetpos/fsetpos头文件#include stdio.h4.int fgetpos(FILE *stream, fpos_t *pos);作用获取当前文件流的位置指示器存入pos结构体中支持超大文件 2GB。参数stream文件流指针。pos输出型参数指向fpos_t类型变量的指针用来接收位置值。返回值成功返回0失败返回非零值并设置errno。5.int fsetpos(FILE *stream, const fpos_t *pos);作用将文件流的位置指示器设置到pos指定的位置通常与fgetpos配合使用。参数stream文件流指针。pos输入型参数指向之前用fgetpos获取的fpos_t值。返回值成功返回0失败返回非零值。与fseek的区别fpos_t可以存储复杂的文件状态在超大文件2GB和特殊文件系统上表现更安全。第三组缓冲区强制刷新fflush头文件#include stdio.h6.int fflush(FILE *stream);作用强制将用户态缓冲区中未写入的数据刷入内核调用write。参数stream文件流指针。如果传NULL则刷新所有已打开的流的输出缓冲区。返回值成功返回0失败返回EOF并设置errno。注意fflush只保证数据到达内核页缓存不保证落盘。想落盘需调用fsync(fileno(fp))。第四组fileno/fdopen头文件#include stdio.h(在 Linux 下fileno和fdopen也依赖unistd.h和fcntl.h)7.int fileno(FILE *stream);作用从标准I/O流FILE*中掏出底层的文件描述符fd。参数stream—— 文件流指针。返回值成功返回底层的int fd失败返回-1。场景当你用fopen打开了文件但突然想用fcntl加锁或者用fsync强制落盘时必须靠它取出fd。8.FILE *fdopen(int fd, const char *mode);作用将一个已有的文件描述符fd包装成一个标准I/O流FILE*。参数fd已打开的文件描述符来自open或socket。mode字符串和fopen一样如r、w。必须与fd打开时的模式兼容比如fd是只读的就不能传w。返回值成功返回FILE*指针失败返回NULL。场景网络编程中你从socket()拿到了fd但想用fprintf格式化输出数据就可以用它包装。第五组安全字符串格式化snprintf/sscanf头文件#include stdio.h9.int snprintf(char *str, size_t size, const char *format, ...);作用将格式化数据写入字符串并保证不超过指定长度末尾自动添加\0防止缓冲区溢出。参数str目标字符串缓冲区。size缓冲区的最大长度包含结尾的\0。format格式化字符串同printf。...可变参数列表。返回值如果缓冲区足够大返回本应写入的字符数不包括结尾的\0如果返回值size说明数据被截断了。铁律永远用snprintf替代不安全的sprintf10.int sscanf(const char *str, const char *format, ...);作用从字符串str中按照format格式提取数据存入后面的变量中。参数str源字符串通常来自fgets读的一行。format格式字符串同scanf。...目标变量的地址带。返回值成功匹配并赋值的参数个数可用于校验读取是否成功。如果返回0或EOF说明格式不匹配。工程组合fgets读一行 sscanf解析 最安全的配置文件/CSV 读取方式避免fscanf直接操作文件流可能导致的卡死或位置错乱。