《同时读写文件 —— 偏移量》

  每一次系统调用的 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来对偏移量做显性偏移。

 





 

posted @ 2022-06-24 15:33  一个不知道干嘛的小萌新  阅读(335)  评论(0编辑  收藏  举报