Linux系统编程----文件编程

张开发
2026/5/12 12:31:10 15 分钟阅读

分享文章

Linux系统编程----文件编程
文件编程1、基于库方式实现2、基于系统调用方式实现详细说明常用函数一、系统IO1、fopen#includestdio.hFILE *fopen(const char *pathname,const char *mode)功能打开文件并关联一个流参数pathname文件名mode模式返回值成功返回FILE*失败返回NULLerrno补充模式 r---只读r---读和写 //这两个要求文件必须存在w---只写w---读和写 //这两个若文件不存在则创建存在则被截断a---追加a----追加读和写 //这两个文件存在则定位到末尾开始写不存在则创建2、fgetcint getc(FILE *stream)功能从流中获得数据一次只能读取一个字符参数streamfopen打开后获得的流指针返回值成功返回读取到的字符失败返回EOF(读到末尾也返回这个)3、fputcint fputcchar cFILE*stream功能将字符c输出到流中参数c要输出的字符stream流返回值成功返回要输出的字符失败返回EOF4、fgetschar*fgetschar*sint sizeFILE *stream功能从stream中读取数据存放到s指定空间最多读取size-1个字符参数s存放的数据空间size要读取的字节数stream要读取的文件流返回值成功返回s失败返回NULL5、fputsint fputsconst char*sFILE*stream功能将s中的字符输出到stream中参数s代表要输出的字符串stream要输出到的文件返回值成功返回非负数失败返回EOF6、freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);功能从 stream 中读取 nmemb 个元素每个元素大小 size 存放到 ptr 指定的空间参数ptr 一块存储空间size 单个元素大小nmemb 元素的个数stream 要读取的文件返回值成功 → 返回读取到的元素个数失败 → 0到达文件结尾也返回 07、fwritesize_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);功能将存放再 ptr 指定的空间中 nmemb 个元素每个元素大小 size写入到 stream 中参数ptr 一块存储空间size 单个元素大小nmemb 元素的个数stream 要写入的文件返回值成功 → 返回写入到的元素个数失败 → 08、fseekint fseek(FILE *stream, long offset, int whence);功能将 stream 指定的文件定位到 offset 的位置以 whence 作为参考起点参数stream 代表要操作的文件offset 偏移量whence 表示参考起点SEEK_SET // 文件开头 → offset 不能是负的SEEK_CUR // 当前位置 → offset 可正可负SEEK_END // 文件末尾 → offset 可正可负返回值成功 → 返回 0失败 → 返回 -1说明fseek 可以往后偏移偏到文件末尾之后配合一次写操作可以产生空洞(hole)文件云盘下载文件时空洞文件提前抢占磁盘空间空洞文件创建步骤a. 先偏移b. 做写操作9、rewindvoid rewind(FILE *stream);功能回到文件开头10、ftelllong ftell(FILE *stream);功能获得文件位置指示器的当前偏移量补获得文件大小fseek(fp, 0, SEEK_END);offset ftell(fp); // offset 就是文件的大小二、文件IO1、openint open(const char *pathname, int flags);功能打开文件可以创建文件参数pathname 这个参数用来指定要打开的文件格式字符串形式flags 指定访问模式必选项必选其一O_RDONLY // 只读O_WRONLY // 只写O_RDWR // 读写附加O_APPEND // 追加O_CREAT // 创建文件O_TRUNC // 截断为0返回值成功 → 文件描述符失败 → -1 errno被设置补fopen(...)对应open(...)调用fopen(r)open(, O_RDONLY)fopen(r)open(, O_RDWR)fopen(w)open(, O_WRONLYfopen(w)open(, O_RDWRfopen(a)open(, O_WRONLYfopen(a)open(, O_RDWR文件操作权限- rwx rwx r-x // 表示文件类型 —— 此时是普通文件rwx — read/write/execute三组权限所有者 → rwx所属组 → 同一组的 → rw-其他人 → r--例子rwx rwx r-x 111 111 101 // 7 7 5一般带mode的open(1.txt, O_WRONLY | O_CREAT, 0666); // 八进制数值2、closeint close(int fd);功能就是把文件描述符关闭3、readssize_t read(int fd, void *buf, size_t count);功能从 fd 中读取 count 个字节的嗯数据存放到 buf 中参数fd // 要读书的文件 → 应为“要读的文件”buf // 存放数据的缓冲区count // 要读取的字节数返回值成功 → 返回读取到的字节数失败 → 返回 -1到达文件结尾 → 返回 04、writessize_t write(int fd, const void *buf, size_t count);功能将 buf 中的 count 字节写入到 fd 中参数fd —— 要操作的文件buf —— 数据存放的空间count —— 要写入的字节数返回值成功 → 返回写入的字节数失败 → -1 errno被设置5、lseekoff_t lseek(int fd, off_t offset, int whence);功能重新定位文件偏移量参数fd → 要定位的文件offset → 表示一个偏移量 —— 可正可负whence → 表示参考点SEEK_SET // 从文件开头开始计算SEEK_CUR // 从当前位置开始计算可正可负SEEK_END // 从文件末尾开始计算可正可负返回值成功 → 返回从头开始的偏移量即新的文件位置失败 → 返回 -1 errno会被设置示例// 定位到开头 lseek(fd, 0, SEEK_SET);// 定位到末尾 lseek(fd, 0, SEEK_END);// 定位到距开头 100 字节处 lseek(fd, 100, SEEK_SET);获取文件大小off_t len lseek(fd, 0, SEEK_END);空洞文件创建示例// 1. 定位 lseek(fd, 100, SEEK_SET);// 2. 写操作 write(fd, , 1);// 写入 1 个空字节在偏移 100 处创建“洞”6、fdopen将fd转为fp7、fileno流指针转换为 fd8、opendirDIR *opendir(const char *name);功能打开一个目录并关联一个目录流参数name —— 目录名返回值成功 → 返回目录流指针失败 → NULL errno9、readdirstruct dirent *readdir(DIR *dirp);功能读取目录获得目录项结构体参数dirp → 代表对应的目录流返回值成功 → 返回保存目录项信息的结构体的地址失败 → 返回 NULL errno被设置读到目录流末尾 → 返回 NULLstruct dirent{ino_t d_ino;off_t d_off;unsigned short d_reclen;unsigned char d_type;char d_name[256];}10、closedirint closedir(DIR *dirp);功能关闭对应的目录流返回值成功 → 0失败 → -1

更多文章