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


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





     

  • 相关阅读:
    founder面试题
    项目bug的修正
    Linux下分割、合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具
    Vim global命令和重复操作
    嵌入式linux GUI--DirectFB + GTK至尊秘笈
    让QT/Embedded支持国际化
    开篇-QT完全手册
    java多线程样例
    Windows Minifilter驱动
    poj 3735 大数量反复操作问题(矩阵高速幂)
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/16409088.html
Copyright © 2020-2023  润新知