C++ C++;ios的替换::noreplace

C++ C++;ios的替换::noreplace,c++,std,fstream,C++,Std,Fstream,我正在使用fstream打开一个文件进行写入。我不想覆盖现有文件,所以在搜索之后,我找到了ios::noreplace。但当我编译这个时: #include <fstream> using namespace std; //......Did something else. ofstream fout; fout.open(outputFile,ios::noreplace);//outputFile is a C string 我只是想知道ios::noreplace是否有std

我正在使用fstream打开一个文件进行写入。我不想覆盖现有文件,所以在搜索之后,我找到了ios::noreplace。但当我编译这个时:

#include <fstream>
using namespace std;
//......Did something else.
ofstream fout;
fout.open(outputFile,ios::noreplace);//outputFile is a C string

我只是想知道ios::noreplace是否有std::替代品?

互联网上的一些搜索显示,您可以通过尝试在“输入”模式下打开来手动添加存在性检查:


noreplace
从未进入标准。大约四秒钟的谷歌搜索结果:

在标准C++中,提供了IOS::NOCREATE和IOS::NoePobe用于控制文件创建的某些实现。这些标志太特定于平台,从未进入标准库,标准库取代了不推荐使用的标准前标题。但是,您可以相当容易地实现这些过时标志的功能


建议的答案是有风险的,因为他们有比赛条件。 除非您能保证在运行此测试时没有人会创建该文件,否则您不应该使用它

作为一种解决方法,请使用不可移植方法(例如在Linux上使用O|u CREAT | O|u exc打开)

您可以将生成的句柄与类似boost的代码一起使用,将其包装到ofstream中,或者在本例中,只使用open()检查文件,然后在文件上创建一个新的ofstream(后者假定中间没有人删除/重命名文件,因此可能仍然存在争用条件)


C++没有提供任何安全的方法来创建文件,这是一个很糟糕的笑话,很可能是造成许多安全漏洞的原因。你必须热爱那些通过不可能编写正确代码来鼓励不良做法的标准。

等等,这对我来说毫无意义。这两个子句的作用完全相同,除了其中一个还完全不必要地打开和关闭一个文件。第二个子句在重新打开进行写入之前关闭第一个fstream open for read,但我不明白为什么不能从开始进行写入时就打开它。当文件确实存在时,你想做什么?追加模式有什么问题?我的程序是处理一些代码,所以不能在其他代码之后追加代码。事实上,我想做的是避免用户意外损坏他们现有的文件。那么,你想做什么呢?当文件已存在时以只读模式打开,而当文件不存在时以可写模式打开?还是怎样你从来没有解释过。什么“代码”?当文件存在时中止。当文件不存在时写入。为什么这个细节不在您的问题中?这是基本的,明目张胆的,简单的。除了我需要打开文件两次。。。谢谢也谢谢其他人。@Yankee威士忌:没办法。任何带有“noreplace”的低级操作都会有类似的冗余,你只是没有意识到而已。
 error: ‘noreplace’ is not a member of ‘std::ios’
std::fstream myfile("thefile.txt", std::ios::in);

if (myfile)
{
    // error, file exists!
}
else
{
    myfile.close();
    myfile.open("thefile.txt", std::ios::out);  // OK now
}
fstream fs(fname, ios_base::in);// attempt open for read
if (!fs)
{
    // file doesn't exist; create a new one
    fs.open(fname, ios_base::out);
}
else //ok, file exists; close and reopen in write mode
{
     // Should throw an error
}