在一个应用程序中,我想确定我正在编写一个全新的(二进制)文件。在Win32编程中,我知道我可以使用CREATE_NEW
使用CreateFile
执行此操作,但我无法使用纯C ++标准方法。
仅当新文件尚不存在时才创建新文件 如果指定的文件存在,则函数失败,最后一个错误代码设置为ERROR_FILE_EXISTS(80)。
如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。
我尝试使用std::ios::out | std::ios::binary | std::ios::ate
,然后查看tellp
是否给了我文件的开头,但除了显然仍会覆盖空文件的情况之外,它似乎也截断了非空文件,就像我使用std::ios::trunc
...
这是在VS2013上,虽然我认为这不是编译器/库错误。
答案 0 :(得分:0)
C ++标准没有保证新文件的API。在没有指定std::ios_base::app
的情况下以只写模式打开现有文件时,它会被截断(与是否使用std::ios_base::trunc
无关)。我不了解Windows,但在POSIX上,这将保留原始的inode,已经打开文件的进程仍然可以访问它。
如果获得一个开放的空文件而不是一个新文件就足够了,省略std::ios_base::in
和std::ios_base::app
应该可以做到这一点(注意打开std::fstream
或{{ 1}}隐式添加std::ifstream
)。