《同时读写文件 —— 偏移量》
每一次系统调用的 read 和 write 成功返回后,文件的偏移量都会被更新。
因此,如果程序对同一个文件描述符进行读写操作的话,肯定会得到非期望的结果,示例代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char buf[20]; int ret; FILE *fp = fopen("./tmp.txt", "w+"); if (!fp) { printf("Fail to open file\n"); return -1; } ret = fwrite("123", sizeof("123"), 1, fp); printf("we write %d member\n", ret); memset(buf, 0, sizeof(buf)); ret = fread(buf, 1, 1, fp); printf("We read %s, ret is %d\n", buf, ret); fwrite("456", sizeof("456"), 1, fp); fclose(fp); return 0; }
得到的结果:
we write 1 member We read , ret is 0
为什么 fread 什么都没有读取到,返回值是 0 呢?这是因为上面的代码中, fwrite 和 fread 操作的是同一个文件指针 fp ,也就是对应的是同一个文件描述符。第一次 fwrite 后,在 tmp.txt 中写入了字符串 “123” ,同时文件偏移为 3 ,也就是到了文件尾。进行 fread 操作时,既然操作的是同一个文件描述符,自然会共享同一个文件偏移,那么,从文件尾自然读取不到任何数据。
可以使用lseek或者fseek来对偏移量做显性偏移。