【问题标题】:C++ substitution of ios::noreplaceios::noreplace 的 C++ 替换
【发布时间】:2012-02-12 18:47:59
【问题描述】:

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

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

我收到一个错误

 error: ‘noreplace’ is not a member of ‘std::ios’

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

【问题讨论】:

  • 当文件确实存在时你想做什么?追加模式有什么问题?
  • 我的程序是处理一些代码,所以在其他代码之后附加代码是不可接受的。事实上,我试图做的是避免用户意外损坏他们现有的文件。
  • 那么,你想做什么?当文件已经存在时以只读模式打开,但不存在时以可写模式打开?要不然是啥?你从来没有解释过。什么“代码”?
  • 文件存在时中止。当文件不存在时写入。
  • 为什么这个细节不在您的问题中?这是基本的。

标签: c++ std fstream


【解决方案1】:

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

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
}

【讨论】:

  • 明目张胆。除了我需要打开文件两次...谢谢。也感谢其他人。
  • @YankeeWhiskey:没办法。无论如何,任何带有“noreplace”的低级操作都会有类似的冗余,你只是不会意识到它。
【解决方案2】:

noreplace 从未进入标准。大约四秒钟的谷歌搜索结果: http://www.devx.com/tips/Tip/14544

在准标准 C++ 中,某些实现提供了标志 ios::nocreate 和 ios::noreplace 来控制文件创建。这些标志太特定于平台,从未进入标准库,它取代了已弃用的预标准标头。但是,您可以相当轻松地实现这些过时标志的功能。

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
}

【讨论】:

  • 别等了,这对我来说毫无意义。两个子句都做同样的事情,期望一个也完全不必要地打开和关闭一个文件。
  • 第二个子句在重新打开写入之前关闭第一个打开读取的 fstream,但我不明白为什么你不能打开它开始写入。小时。
【解决方案3】:

建议的答案是有风险的,因为它们有竞争条件。 除非你能保证在你运行这个测试时没有人会创建那个文件,否则你不应该使用它。

作为一种解决方法,使用不可移植的方法(例如在 Linux 上使用 O_CREAT|O_EXCL 打开)。

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

C++ 不提供任何安全的方法来创建文件是一个糟糕的笑话,并且可能是许多安全漏洞的原因。您必须喜欢那些通过使编写正确代码变得不可能来鼓励不良做法的标准。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多