c - 系统调用 "open()"中的 O_TRUNC 实际上并未删除文件内容

标签 c unix system-calls

据我了解,open() 函数的O_TRUNC 说明符应该先删除文件中的内容,然后再开始写入。
相反,它所做的只是让我随时覆盖文件中的内容。
我的问题是文件包含 ASCII“11”,它应该做的是读取它并将其覆盖为“8”,但文件最终为“81”,因为它在写入之前没有删除整个内容。
代码的目标是读取文件中的数字,将其减 3,然后将该数字放回文件中,仅使用系统调用。

#include <unistd.h>
#include <fcntl.h>

int main(int argc, char*argv[]){

    int fp = open("file.txt", O_RDONLY);
    char c1, c2, c3='\n';

    read(fp, &c1, 1);
    read(fp, &c2, 1);
    close(fp);
    fp = open("file.txt", O_TRUNC || O_WRONLY);

    if (c2 == '\n')
        c1 -= 3;
    else {
        if (c2 >= '0' && c2 <= '2' ) {
            c1--;
            c2 += 7;
        }
        else
            c2 -= 3;

    }
    if (c1 != '0')
        write(fp,&c1,1);
    if (c2 != '\n')
        write(fp,&c2,1);
    write(fp,&c3,1);
    return 0;
}

最佳答案

O_TRUNC || O_WRONLY 是一个逻辑“或”,几乎肯定会导致 int 值为 1,这通常是 O_WRONLY 的定义到。您需要使用 | 运算符的按位“或”。请注意,它只是一个 | 字符:

fp = open("file.txt", O_TRUNC | O_WRONLY);

关于c - 系统调用 "open()"中的 O_TRUNC 实际上并未删除文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49040262/

相关文章:

c - 解决strtok While循环打破外层while循环问题

Shell脚本-如何从行中提取

c - 系统调用 : Outputing file and pausing every 20 lines

linux - "Segmentation fault",x86_64 程序集,AT&T 语法

Linux glibc 系统调用包装器位置

c - 有哪些不同的方法可以使终端不回显我们使用标准库键入的内容?

c - 最新版libnfc找不到读卡器

c - c中的本地结构

string - Shell 脚本 - 从变量中删除第一个和最后一个引号 (")

linux - 默认情况下,剪切命令未正确提取字段