C ++ ofstream相当于带有CREATE_NEW的Win32 CreateFile

时间:2014-12-30 14:04:16

标签: c++ file file-io io fstream

在一个应用程序中,我想确定我正在编写一个全新的(二进制)文件。在Win32编程中,我知道我可以使用CREATE_NEW使用CreateFile执行此操作,但我无法使用纯C ++标准方法。

  

仅当新文件尚不存在时才创建新文件   如果指定的文件存在,则函数失败,最后一个错误代码设置为ERROR_FILE_EXISTS(80)。
  如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。

我尝试使用std::ios::out | std::ios::binary | std::ios::ate,然后查看tellp是否给了我文件的开头,但除了显然仍会覆盖空文件的情况之外,它似乎也截断了非空文件,就像我使用std::ios::trunc ...

一样

这是在VS2013上,虽然我认为这不是编译器/库错误。

1 个答案:

答案 0 :(得分:0)

C ++标准没有保证新文件的API。在没有指定std::ios_base::app的情况下以只写模式打开现有文件时,它会被截断(与是否使用std::ios_base::trunc无关)。我不了解Windows,但在POSIX上,这将保留原始的inode,已经打开文件的进程仍然可以访问它。

如果获得一个开放的空文件而不是一个新文件就足够了,省略std::ios_base::instd::ios_base::app应该可以做到这一点(注意打开std::fstream或{{ 1}}隐式添加std::ifstream)。