系统调用"open()"中的O_TRUNC实际上没有删除文件内容

Seb*_*iva 3 c unix system-calls

根据我的理解,函数的O_TRUNC说明符open()应首先删除文件中的内容,然后开始编写.
相反,它正在做的就是让我覆盖文件中的内容.
我的问题是该文件包含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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*nle 9

O_TRUNC || O_WRONLY是一个逻辑 "或",几乎肯定会导致int值为1,这通常O_WRONLY是定义为.你想要与运算符按位 "或" |.请注意,它只是一个|字符:

fp = open("file.txt", O_TRUNC | O_WRONLY);
Run Code Online (Sandbox Code Playgroud)

  • @SebastianOliva*我一整天都在盯着这个,我简直不敢相信我没看到*欢迎编程.如果你继续,这不会是你最后一次这样做,我可以向你保证.请记住,世界上有两种程序员:那些编写错误代码的程序员和说谎者.;-) (2认同)
  • 也许只要您一直在编程,我就会停止制作tpyos。 (2认同)