如何在C中追加到文件,在Linux上使用O_APPEND模式打开?

Der*_*ger 5 c linux file-io file append

这是家庭作业的一部分.好吧,我的作业无法正常工作,所以我已经把一个片段拿出来并开始用它来弄清楚什么是错的.

在C语言的Linux上我试图打开/创建一个文本文件,给它写一些东西,关闭它,在读/写和追加模式下打开它,然后在它的末尾添加任何东西(在这个例子中,字符串",老兄").但是没有附加任何内容,但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;
}
Run Code Online (Sandbox Code Playgroud)

我试图通过搞乱一些不同的组合,将模式变量更改为S_IRWXU来消除严格意义上的权限问题.S_IRWXG | S_IRWXO,在我的第二个open语句中将模式作为第三个参数传递,只在第二个open语句中以append模式打开文件,在第二个open语句中将append模式作为第三个参数传递,等等.

我能做的最好的就是在没有APPEND模式的情况下在RDWR中打开它,然后直接在现有文本上写...但这不是我想要的.请注意,我知道像lseek这样的东西,但这里的目的是严格使用追加模式将文本添加到文件的末尾.我不想lseek.

看到这个的任何线索?我确定有一些显而易见的东西,我只是不明白.

非常感谢.

Roh*_*han 3

您尝试写入的字节数不正确,

char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};
size_t n = sizeof(buf);
if(write (fd, buf, n) < 0){
Run Code Online (Sandbox Code Playgroud)

而不是你应该做的

char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l', '\0'};
size_t n = strlen(buf); //use strlen 
if(write (fd, buf, n) < 0){
Run Code Online (Sandbox Code Playgroud)

同样,对其他写入和读取也执行此操作。如果你没有'\0'在文件中写入终止字符串,那么当你从文件中读取数据时,你将不会得到它。

在阅读时,您应该尝试直到读取整个文件,即。你得到EOF