我对lseek()的返回值(这是新的文件偏移量)感到困惑。
我有文本文件(它的名字是prwtest)。它的内容被写到a到z。
我写的代码如下,
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6
7 #define BUF 50
8
9 int main(void)
10 {
11 char buf1[]="abcdefghijklmnopqrstuvwxyz";
12 char buf2[BUF];
13 int fd;
14 int read_cnt;
15 off_t cur_offset;
16
17 fd=openat(AT_FDCWD, "prwtest", O_CREAT | O_RDWR | O_APPEND);
18 cur_offset=lseek(fd, 0, SEEK_CUR);
19 //pwrite(fd, buf1, strlen(buf1), 0);
20 //write(fd, buf1, strlen(buf1));
21 //cur_offset=lseek(fd, 0, SEEK_END);
22
23 printf("current offset of file prwtest: %d \n", cur_offset);
24
25 exit(0);
26 }在行号17上,我使用标志O_APPEND,因此prwtest的当前文件偏移量来自于i节点的当前文件大小。(是26)
在行号18上,我使用由SEEK_CUR使用的lseek(),偏移量为0。
但结果值cur_offset为0。(我假设它必须是26,因为SEEK_CUR表示当前文件偏移量。)然而,SEEK_END给了我我的想法,cur_offset是26岁。
为什么lseek(fd, 0, SEEK_CUR);给我返回值0,而不是26?
发布于 2016-02-29 09:06:59
你的问题是open() / openat(),而不是lseek()。
从open()手册中,我强调:
O_APPEND 文件以附加模式打开。在每次写(2)之前,文件偏移量被定位在文件的末尾,就像使用write(2)一样。
因为您没有写入文件,所以偏移量永远不会被重新定位到文件的末尾。
我们在做的时候,你应该在程序结束之前关闭文件.
实际上,虽然我们已经做了#include <stdio.h>,为什么不使用标准的文件I/O (fopen() / fseek() / fwrite())而不是POSIX特定的东西呢?
发布于 2016-02-29 09:07:44
O_APPEND在每次写入文件之前生效,而不是在打开文件时生效。
因此,在打开之后,位置仍然是0,但是如果您调用写,lseek on SEEK_CUR将返回正确的值。
https://stackoverflow.com/questions/35695471
复制相似问题