为什么SEEK_SET标志没有按预期工作

时间:2014-06-19 00:11:43

标签: c linux

我试图对以写入模式打开的文件执行lseek(),如下所示。但它没有按预期工作。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

main()
{
    int fd = open("/local/sandbox/.C/mytest", O_WRONLY | O_APPEND);

    if(fd == -1)
    {
        printf("\nFailed to opne file in write mode\n");
        return -1;
    }

    lseek(fd, 2, SEEK_SET);
    write(fd, "OK", 2);
    write(fd, "AAAAAAAA", 3);

    close(fd);
}

&#39; mytest的&#39;文件已经存在与内容&#34;嗨,你好吗&#34;。我想在执行程序后,我的测试将包含&#39; HiOKAAA,你好吗&#34;。但相反,它正在编写&#34; OKAAA&#34;在末尾。是因为O_APPEND标志?但即便如此,我使用lseek()将文件偏移量更改为&#39; 2&#39;只要。任何人都可以让我知道它失败的原因吗?

1 个答案:

答案 0 :(得分:1)

是的,O_APPEND选项导致此问题。来自open的POSIX规范:

  

O_APPEND

     

如果设置,则文件偏移量应设置为每次写入之前文件的末尾。

如果您希望能够写入文件中的任意位置,请不要使用O_APPEND模式。