尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux学习笔记:文件IO

Linux学习笔记:文件IO 之前学了标准IO这篇整理文件IO的部分。文件IO是Linux内核提供的接口属于系统调用操作对象是文件描述符而不是FILE指针。核心就四个open打开、read读、write写、close关闭。open#include sys/types.h#include sys/stat.h#include fcntl.hint open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);打开一个文件返回文件描述符失败返回-1。flags是打开方式常用的- O_RDONLY只读- O_WRONLY只写- O_RDWR读写- O_CREAT创建- O_TRUNC清空- O_APPEND追加可以组合使用比如标准IO的w对应 O_WRONLY | O_TRUNC | O_CREAT mode给0664。a对应 O_WRONLY | O_CREAT | O_APPEND 。mode参数是文件权限实际权限是 mode ~umask 普通文件一般给0664。文件描述符打开文件时系统分配的一个小的非负整数用来标记这个文件。默认范围0-1023共1024个分配原则是最小未被使用。系统默认已经打开三个- 0 —— STDIN_FILENO标准输入- 1 —— STDOUT_FILENO标准输出- 2 —— STDERR_FILENO标准出错close#include unistd.hint close(int fd);关闭文件成功返回0失败返回-1。打开的文件用完一定要关不然会造成文件描述符泄露。writessize_t write(int fd, const void *buf, size_t count);向文件写入count字节的数据成功返回实际写入的字节数失败返回-1。readssize_t read(int fd, void *buf, size_t count);从文件读取数据成功返回实际读到的字节数到达文件末尾返回0失败返回-1。用read和write实现文件拷贝int file_copy(const char *srcfile, const char *dstfile){int fdsrc open(srcfile, O_RDONLY);int fddst open(dstfile, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (-1 fdsrc || -1 fddst){printf(open error\n);return -1;}char buff[1024] {0};ssize_t size 0;while ((size read(fdsrc, buff, sizeof(buff))) 0){write(fddst, buff, size);}close(fdsrc);close(fddst);return 0;}lseekoff_t lseek(int fd, off_t offset, int whence);重新定位文件的读写位置。whence有三个取值- SEEK_SET从文件开头偏移- SEEK_CUR从当前位置偏移- SEEK_END从文件末尾偏移成功返回当前位置到文件开头的偏移量失败返回-1。可以用来求文件大小也可以创建空洞文件抢占磁盘空间。文件IO和标准IO的区别标准IO 文件IO操作对象 FILE *文件流指针 fd文件描述符性质 标准C库函数可移植性强 Linux系统调用可移植性弱缓冲区 有缓冲区减少用户层和内核层切换效率高 无缓冲区实时性好适用场景 主要操作普通文件 普通文件、硬件设备类文件标准IO的缓冲区分三种- 行缓冲默认1K用在终端交互。遇到\n刷新、程序结束刷新、fflush强制刷新、缓冲区满刷新。- 全缓冲默认4K文件交互。程序结束刷新、文件关闭刷新、缓冲区满刷新、fflush强制刷新。- 无缓冲0K比如stderr出错信息直接输出。其他几个格式化输出和字符串处理函数int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);fprintf把格式化后的字符串写入指定的文件流。int dprintf(int fd, const char *format, ...);dprintf写入到文件描述符代表的文件中。int sprintf(char *str, const char *format, ...);sprintf把格式化后的字符串写入字符数组常用于字符串拼接、把整型或浮点型转成字符串。char *strtok(char *str, const char *delim);字符串截取函数。str是原始字符串delim是分隔符。成功返回截取到的子字符串首地址到末尾返回NULL。第一次调用传str后续传NULL继续截取。
返回列表