std::fstream
的正确I / O标志集是什么,我希望能够从和读取文件,而不截断文件(如果存在) ,但如果没有,那就创建它?
我试过
std::ios::binary | std::ios::in | std::ios::out
std::ios::binary | std::ios::in | std::ios::out | std::ios::ate
但如果文件尚不存在,则这些文件都不会创建。
我不想要std::ios::app
,因为我还需要能够随意搜索文件,同时使用 get 和 put 游标
我认为,一种解决方法是首先实例化std::ofstream
,然后立即关闭它并打开我真正想要的流,但如果单个流对象可以避免这种情况,那么这似乎很麻烦。
答案 0 :(得分:3)
目前,我得出的结论是std::ios::in
完全阻止了这一点,我必须使用解决方法。
所以:
if (!std::ostream(path.c_str()))
throw std::runtime_error("Could not create/open file");
std::fstream fs(path.c_str(), std::ios::binary | std::ios::in | std::ios::out);
if (!fs)
throw std::runtime_error("Could not open file");
// ... use `fs`
答案 1 :(得分:2)
从Linux的角度进行调查(尽管其中很多可能适用于其他Unices):
在系统调用层,您需要open(O_RDWR | O_CREAT, 0666)
(但不是O_TRUNC
或O_APPEND
或其他一些标志,但可以说所有文件都应该使用O_CLOEXEC | O_LARGEFILE
打开,但那不是重点)
在libc层,没有标准mode
字符串暗示O_CREAT
没有O_TRUNC
。但是,您可以使用open
后跟fdopen
。
在C ++库级别,没有传递所需标志的标准方法。但是,使用特定于实现的类/函数或第三方库,它是可能的;见
就个人而言,我倾向于在C或甚至系统调用级别进行所有I / O,因为API更好,而且更容易预测。对于类实例的输入/输出,我有自己的模板。
答案 2 :(得分:-1)
将application:didReceiveRemoteNotification:fetchCompletionHandler:
视为已阅读,您可能需要的其余std::ios::binary
是:
openmode
它的效果好像是用以下内容打开文件:
std::ios::in | std::ios::app
的效果:
如果您使用此std::fopen(filename,"a+")
打开文件std::fstream
,则不会截断该文件(如果存在)。你可以
从openmode
的{{1}}指针所指向的文件中读取,
如果有东西要读,你可以定位指针
使用流的fstream
进行阅读。但是,所有的写入都将是
附加到文件末尾。
因此,除非您需要执行写操作,否则此开放模式将适合您的账单 现有数据。