C语言 如何使open()截断现有文件

hc8w905p  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(116)

我用open()函数打开一个文件。
我希望open()函数丢弃已经存在的文件内容,然后将该文件视为一个新的空文件。
我尝试了以下代码:

int open_file(char *filename)
{
    int fd = -1;
    fd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
    if (fd < 0) {
        printf("Couldn't create new file %s: %s\n",
            filename, strerror(errno));
        return -1;
    }
    close(fd);
    return 0;
}

字符串
但我得到了以下错误:

Couldn't create new file kallel333: File exists


我错过了什么?

sshcrbum

sshcrbum1#

请添加O_TRYST标志并删除O_EXCL。

open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);

字符串
从打开的手册页-
O_EXCL确保此调用创建文件:如果此标志与O_CREAT一起指定,并且路径名已经存在,则open()将失败。
如果文件已经存在,并且是一个常规文件,并且访问模式允许写入(即O_RDWR或O_WRONLY),则它将被截断为长度0。

yws3nbqq

yws3nbqq2#

问题出在O_EXCL标志上。来自open(2)的手册页:
O_EXCL确保此调用创建文件:如果此标志与O_CREAT一起指定,并且路径名已经存在,则open()将失败。
我建议删除O_EXCL,添加O_TRUNC,然后再试一次。

kxkpmulp

kxkpmulp3#

open()的手册页是这样描述O_TRIBUTION标志的:
如果文件已经存在,并且是一个常规文件,并且打开模式允许写入(即O_RDWR或O_WRONLY),则它将被截断为长度0。如果文件是FIFO或终端设备文件,则忽略O_TRUNK标志。否则,O_TRUNK的效果未指定。

dwbf0jvd

dwbf0jvd4#

正如大家所说,这是由于使用了O_EXCL标志,而它应该是O_TRUNC标志。我也遇到了同样的问题。我对任何试图使用这些涉及宏的系统调用的人最好的建议是阅读你的系统调用的手册页。在你试图使用它们和混淆自己之前,理解你的宏的意思。
man 2 open

vzgqcmou

vzgqcmou5#

我会告诉你这个错误是怎么回事!Open函数将具有返回类型,即在执行此系统调用后将返回某个值(在您的情况下将存储在fd中)。此值将指示系统调用的执行是否成功。当open系统调用失败时,它自动返回-1(到fd),您已经在函数int fd = -1;的第一个语句中初始化了它。因此,语句if (fd < 0)被验证为正确的,因此您得到了该错误。**请注意,您不应该设置系统调用的返回值,它们会在程序执行时自动返回。你需要做的就是确保你捕获了这个值并验证它。**所以请将函数int fd = -1的第一条语句改为简单的int fd

底线:您将open系统调用的返回值设置为-1,从而告诉编译器无论如何都应该创建失败!!至于权限,请参阅其他注解!!:)

相关问题