首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lseek()返回值

lseek()返回值
EN

Stack Overflow用户
提问于 2016-02-29 09:03:00
回答 2查看 2.8K关注 0票数 1

我对lseek()的返回值(这是新的文件偏移量)感到困惑。

我有文本文件(它的名字是prwtest)。它的内容被写到a到z。

我写的代码如下,

代码语言:javascript
复制
  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?

EN

回答 2

Stack Overflow用户

发布于 2016-02-29 09:06:59

你的问题是open() / openat(),而不是lseek()

open()手册中,我强调:

O_APPEND 文件以附加模式打开。在每次写(2)之前,文件偏移量被定位在文件的末尾,就像使用write(2)一样。

因为您没有写入文件,所以偏移量永远不会被重新定位到文件的末尾。

我们在做的时候,你应该在程序结束之前关闭文件.

实际上,虽然我们已经做了#include <stdio.h>,为什么不使用标准的文件I/O (fopen() / fseek() / fwrite())而不是POSIX特定的东西呢?

票数 3
EN

Stack Overflow用户

发布于 2016-02-29 09:07:44

O_APPEND在每次写入文件之前生效,而不是在打开文件时生效。

因此,在打开之后,位置仍然是0,但是如果您调用写,lseek on SEEK_CUR将返回正确的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35695471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档