C++ C++;仅当文件不存在时才打开文件进行写入

C++ C++;仅当文件不存在时才打开文件进行写入,c++,c,file,std,C++,C,File,Std,我想用标准库打开一个文件进行写入,但是如果该文件已经存在,则文件打开会失败 从文档中可以看到,ofstream::open只允许追加或截断 当然,我可以尝试打开进行读取,以检查文件是否存在,如果不存在,则重新打开进行写入,但不能保证文件不会由中间的另一个进程创建 在C++中,有人可以确认这是不可能的,标准代码库(STD:IOSROW)或C函数(文件*函数)< P> >代码> STD::OFFROWS本身,不打开一个文件,如果它不存在,总是创建一个新文件。没有办法改变这种行为。如果文件不存在,则打

我想用标准库打开一个文件进行写入,但是如果该文件已经存在,则文件打开会失败

从文档中可以看到,ofstream::open只允许追加或截断

当然,我可以尝试打开进行读取,以检查文件是否存在,如果不存在,则重新打开进行写入,但不能保证文件不会由中间的另一个进程创建


在C++中,有人可以确认这是不可能的,标准代码库(STD:IOSROW)或C函数(文件*函数)

< P> >代码> STD::OFFROWS本身,不打开一个文件,如果它不存在,总是创建一个新文件。没有办法改变这种行为。如果文件不存在,则打开文件进行读取失败

但是,至少在Windows上,Win32 API
CreateFile()
函数有一个
CREATE\u NEW
标志,如果文件已经存在,则无法打开该文件。在其他平台上,可能有标志可用于
\u fsopen()
fopen()
完成相同的任务

< > >可以将<代码>文件> <代码>附加到<代码> STD::OFFROWS(或者这只是一个微软扩展,我不确定),并且在VisualC++中,可以使用<代码> *OpenOSfHANDOLLE()/<代码> <代码> -fDOPENE()/<代码>,为<代码>句柄< /COD> > <代码> >创建文件()/代码>创建一个<代码>文件> <代码> >。有关示例,请参见此问题:

其他编译器/平台可能会提供类似的扩展来初始化
std::ofstream
,您必须四处查看。

由于C11(以及C++17),对于
fopen
,您可以使用模式
“x”
-独占模式,请参阅:

文件访问模式标志“x”可以选择性地附加到“w”或“w+” 说明符。如果文件存在,此标志将强制函数失败, 而不是覆盖它


<> >没有代码> fStuts<代码> >,但是<代码> STD::fOpen< /COD> C++和<代码> STD::Sin < /代码> .< 如果您必须拥有此文件的
fstream
对象并且需要原子检查,则应首先调用
fopen
,然后在成功后,
fclose
fstream::open

std::ofstream创建新文件以进行写入()
{
FILE*fp=nullptr;
std::字符串fname;
做{
fname=random_file_name();
fp=fopen(fname.c_str(),“wx”);
}而(!fp);
//在这里创建文件,您“拥有”文件名
fclose(fp);
返回标准::ostream(fname);
}

尝试打开该文件进行读取,以检查它是否已经存在。@Olaf这太过分了-picking@DieterL尤金:不!打开和处理文件的典型功能在两种语言中有所不同。更糟糕的是,OP没有显示任何代码,说明她如何准确地打开文件。这两种语言都有非常不同的标准库。在C/C++中没有任何“原子”文件访问。您必须在操作系统级别上解决它。@πάνταῥεῖ : 你没有读完整的帖子!有人可以在支票和open for WritingHanks之间创建文件!遗憾的是,并没有在ofstream中添加任何等价物,但至少我有一个标准方法,这是误导性的。问题是关于C++,这种访问模式只能在C11中使用。@鲁斯兰-阅读这部分:“或者用C函数(文件*函数)”。我补充说,[C] TAGI假设C函数是C++中C兼容性(如<代码> <代码>头等),不是单独的C语言函数。但你的观点也是正确的。如果您编辑您的答案以说明此模式在C++17(其中引用C11而不是C99)之前不可用,我将能够删除下一票。@Ruslan-fill free编辑“我的”答案。SO中的所有帖子都归SO社区所有。如果你认为这是必要的,那么为什么不呢?但是我不是100%相信-对于我来说,你在答案下的宝贵评论对于那些喜欢这些细节的人来说是足够的信息。如果我没有弄错的话,这个代码仍然具有竞争条件。您应该将最后两行替换为
std::ostream mystream(fname);fclose(fp);返回mystream
,以防止在fclose和流创建之间创建新文件。虽然我不确定这样做是否违法。在linux上,我的小测试还是成功了。