O“系统调用中的TRUNC”;打开();不实际删除文件的内容

O“系统调用中的TRUNC”;打开();不实际删除文件的内容,c,unix,system-calls,C,Unix,System Calls,据我所知,open()函数的O\u TRUNC说明符应该先删除文件中的内容,然后开始写入。 相反,它所做的只是让我在运行时覆盖文件中的内容。 我的问题是该文件包含ASCII“11”,它应该做的是读取该文件并将其覆盖为“8”,但该文件最终为“81”,因为它在写入之前没有删除整个内容。 代码的目标是读取文件中的数字,将其递减3,然后仅使用系统调用将该数字放回文件中 #include <unistd.h> #include <fcntl.h> int main(int arg

据我所知,
open()
函数的
O\u 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;
}
#包括
#包括
int main(int argc,char*argv[]){
int fp=open(“file.txt”,仅限ordu);
字符c1、c2、c3='\n';
读取(fp和c1,1);
读取(fp和c2,1);
关闭(fp);
fp=open(“file.txt”,O|TRUNC | O| WRONLY);
如果(c2=='\n')
c1-=3;
否则{

如果(c2>='0'&&c2
O|TRUNC|O|uwronly
是一个逻辑“或”,并且几乎肯定会导致
int
值为1,这通常是
O|WRONLY
定义的值。您需要一个带有
运算符的按位“或”。请注意,它只是一个
字符:

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

@SebastianOliva我整天都在关注这个问题,我不敢相信我没有看到编程的欢迎。如果你继续,我可以向你保证,这不会是你最后一次这么做。记住,世界上有两种程序员:编写错误代码的程序员和说谎者也许当你像我一样一直在编程的时候,你就会停止做tpyos了。