c - 如何在 C 中 append 到文件,在 Linux 上使用 O_APPEND 模式打开?

标签 c linux file file-io append

这是家庭作业的一部分。好吧,我的家庭作业无法正常工作,所以我提取了一个片段并开始摆弄它以找出问题所在。

在 C 的 Linux 上,我试图打开/创建一个文本文件,向其中写入一些内容,关闭它,以读/写和追加模式打开它,然后将任何内容追加到它的结尾(在这个例子中,字符串“, dude”)。虽然没有 append 任何内容,但是 write 方法也没有抛出错误。我不确定发生了什么。

代码如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

#define BUFFSIZE 4096

int main(){
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

    int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode);

    char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};

    size_t n = sizeof(buf);
    if(write (fd, buf, n) < 0){
        printf("Error in write\n");
        printf("%s", strerror(errno));
        return 1;
    }

    close(fd);

    int fd2 = open("tempfile.txt", O_RDWR | O_APPEND);

    printf("appending dude:\n");
    char buf2[6] = {',', ' ', 'd', 'u', 'd', 'e'};
    size_t p = sizeof(buf2);
    if(write (fd2, buf2, p) < 0){
        printf("Error in write\n");
        printf("%s", strerror(errno));
        return 1;
    }

    char buf3[BUFFSIZE];
    lseek(fd2, 0, SEEK_SET);
    if(read (fd2, buf3, BUFFSIZE) < 0){
        printf("Error in read\n");
        printf("%s", strerror(errno));
        return 2;
    }
    int i;
    for (i = 0; i < strlen(buf3); ++i){
        printf("%c", buf3[i]);
    }
    printf("\n");

    close(fd2);

    return 0;
}

我试图通过搞乱一些不同的组合来消除它严格来说是权限问题的可能性,将模式变量更改为 S_IRWXU | S_IRWXG | S_IRWXO,在我的第二个打开语句中将模式作为第三个参数传递,在第二个打开语句中仅以追加模式打开文件,在第二个打开语句中将追加模式作为第三个参数传递,等等。

我能做的最好的事情就是在没有 APPEND 模式的情况下在 RDWR 中打开它,然后直接覆盖现有文本……但这不是我想要的。请注意,我知道 lseek 之类的东西,但这里的目的严格来说是使用追加模式将文本添加到文件末尾。我不想寻找。

看看这个有什么线索吗?我敢肯定有一些明显的事情我就是不明白。

非常感谢。

最佳答案

嗯,我刚试过你的程序,知道出了什么问题。

基本上,它确实有效,但有一个小故障。当您第一次将“thy fall”写入文件时,您使用了 4096 字节的 char 数组,并将整个数组写入文件。这意味着您正在写“thy fall”,后跟 4088 个随机字符。稍后,当您追加时,您将追加到第 4097 个位置。这可能不是您想要做的。

如果您简单地cat 您创建的文件,您将看到预期的输出“thy fall, dude”。但是,当您在代码中完全阅读它时,您只会阅读 4096 个字符。因此,永远不会读取“, dude”部分,这就是为什么您的程序永远不会输出它。

我的解决方案是,您需要更改数组大小。读取时,以 100 或 1000 为单位读取,直到达到 EOF(read 将返回 -1)。

关于c - 如何在 C 中 append 到文件,在 Linux 上使用 O_APPEND 模式打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151136/

相关文章:

file - 通过互联网发送文件的可靠方式

c - 无法在 C 中正确读取文件

c++ - 使用 GNU C/C++ 编译器在 Eclipse 中找不到库文件

linux - 这个 sed 命令行有什么作用?

linux - 如何使用 sed 提取子字符串

linux - CentOS 7.2 上的脏牛补丁 - kernel-debuginfo

java - 无法从文件中读取对象并将它们放入java中的链表中

具有等待时间的 pthreads 的消费者/生产者

c - "Subscripted Value is Neither Array Nor Pointer"词典程序出错

c - 用空格分割字符串