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

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

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





 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表