C 如果文件已经存在(处于写入模式),fopen会失败吗?

C 如果文件已经存在(处于写入模式),fopen会失败吗?,c,file,C,File,我希望使用fopen(“/temp/abc.txt”,“w”) 我希望如果文件已经存在,fopen应该失败,这样我可以通过更改名称重试。Ex-重命名为abc_1.txt access()不是我的首选方式,因为有可能在access()调用检查之后和fopen()之前创建文件 处理此问题的更好方法是什么?在C11中,它满足您的要求。然而,我不知道在早期的标准中有任何可移植的方法来实现这一点 大多数操作系统在其特定于平台的文件打开原语中都支持这样的标志。在POSIX系统上,这可以通过O_EXCL实现,

我希望使用
fopen(“/temp/abc.txt”,“w”)

我希望如果文件已经存在,
fopen
应该失败,这样我可以通过更改名称重试。Ex-重命名为
abc_1.txt

access()
不是我的首选方式,因为有可能在
access()
调用检查之后和
fopen()之前创建文件

处理此问题的更好方法是什么?

在C11中,它满足您的要求。然而,我不知道在早期的标准中有任何可移植的方法来实现这一点

大多数操作系统在其特定于平台的文件打开原语中都支持这样的标志。在POSIX系统上,这可以通过
O_EXCL
实现,而在Windows上,这可以通过C11中的
CREATE_ALWAYS

实现,这符合您的要求。然而,我不知道在早期的标准中有任何可移植的方法来实现这一点


大多数操作系统在其特定于平台的文件打开原语中都支持这样的标志。在POSIX系统上,这可以通过
O_EXCL
来实现,而在Windows上,这可以通过
CREATE_ALWAYS
来实现,作为一种随机思想,如果您不想/不能使用“x”标志(这可能是最好的方法),您可以尝试使用“a”而不是“w”,然后选中
tell()==0
。但是,这将接受不存在的文件和空文件。

作为一种随机想法,如果您不想/不能使用“x”标志(这可能是最好的方法),您可以尝试使用“a”而不是“w”,然后选中
tell()==0
。但是,这将接受不存在的文件和空文件。

在POSIX系统上,您可以使用函数或其相关函数创建文件,返回文件描述符,然后使用从文件描述符创建文件流。除其他优点外,这使您能够比标准I/O库更准确地控制所创建文件的权限

int fd = open(target_file, O_CREAT | O_EXCL | O_RDWR, 0600);
if (fd < 0)
    …report error and return or exit…
FILE *fp = fdopen(fd, "w+");
if (fp == 0)
    …report error and return or exit…

…use file stream fp…

fclose(fp);
// Do not close(fd) too, and especially not before the fclose(fp)!
intfd=open(目标文件,O|u CREAT | O|u EXCL | O|u RDWR,0600);
如果(fd<0)
…报告错误并返回或退出…
文件*fp=fdopen(fd,“w+”);
如果(fp==0)
…报告错误并返回或退出…
…使用文件流fp…
fclose(fp);
//不要关闭(fd),尤其是在fclose(fp)之前!

在POSIX系统上,您可以使用函数或其相关函数创建文件,返回文件描述符,然后使用从文件描述符创建文件流。除其他优点外,这使您能够比标准I/O库更准确地控制所创建文件的权限

int fd = open(target_file, O_CREAT | O_EXCL | O_RDWR, 0600);
if (fd < 0)
    …report error and return or exit…
FILE *fp = fdopen(fd, "w+");
if (fp == 0)
    …report error and return or exit…

…use file stream fp…

fclose(fp);
// Do not close(fd) too, and especially not before the fclose(fp)!
intfd=open(目标文件,O|u CREAT | O|u EXCL | O|u RDWR,0600);
如果(fd<0)
…报告错误并返回或退出…
文件*fp=fdopen(fd,“w+”);
如果(fp==0)
…报告错误并返回或退出…
…使用文件流fp…
fclose(fp);
//不要关闭(fd),尤其是在fclose(fp)之前!
可能
“wx”
创建用于写作的文本文件?可能
“wx”
创建用于写作的文本文件?