C++ substitution of ios::noreplace
C++ substitution of ios::noreplace
我正在使用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’
我只是想知道ios::noreplace是否有std::子教程?
在互联网上的一些搜索显示,您可以通过尝试在"输入"模式下打开来手动添加存在检查:
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
}
建议的答案有风险,因为它们有种族条件。除非你能保证在你运行这个测试时没有人会创建那个文件,否则你不应该使用它
作为一种解决方法,请使用不可移植的方法(例如在Linux上使用O_CREAT|O_EXCL打开)。
您可以将生成的句柄与boost等代码一起使用,将其封装到一个ofstream中,或者在这种情况下,只使用open()来检查并在文件上创建一个新的ofstream(后者假设没有人在两者之间删除/重命名文件,因此可能仍然存在争用条件)。
C++没有提供任何安全的方法来创建文件是一个坏笑话,很可能是造成许多安全漏洞的原因。你必须热爱那些通过使编写正确代码变得不可能而鼓励不良做法的标准。
noreplace
从未进入标准。大约4秒的谷歌搜索收益率: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
}
投诉得到解决!C++23最终标准化了std::ios_base::noreplace
标志,以打开一个文件以独占模式进行写入,即如果该文件已经存在,则失败。
纸张:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2467r1.html
常见的标准库实现已经在C++23模式中支持这一点,包括与GCC/g++
捆绑在一起的libstdc++
。
- 使用ios:ate写入到流会覆盖现有文件
- 如何访问RTCVideoRenderer的帧?(ios)
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 'string'文件在带有C++文件的iOS插件上找不到
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 C++ iOS::ate 获取错误的文件大小
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 如何正确设置 ios 标志以进行流操作?
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- C++ std::locale( "en" ) 在 iOS 上引发异常
- 在瓦尔格林德的泄漏摘要中使用 std::ios::sync_with_stdio(fasle) 打印时获取"still reachable"
- 在iOS应用程序中创建数据库
- Qt & Firebase C++ SDK 在 iOS 上的链接问题
- 是否有可以在iOS上运行的API来更改现有视频的每秒帧数?
- 将文件从 iOS 应用程序加载到 C++ 对象中/<iostream>iOS 上的问题
- ios::app 和 ios::noreplace 模式在文件处理中有什么区别?
- C++ substitution of ios::noreplace