每一次系统调用的 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来对偏移量做显性偏移。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |