《同时读写文件 —— 偏移量》
每一次系统调用的 read 和 write 成功返回后,文件的偏移量都会被更新。因此,如果程序对同一个文件描述符进行读写操作的话,肯定会得到非期望的结果,示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char buf;
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来对偏移量做显性偏移。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]