如何打开文件进行阅读和阅读写作,创建它,如果它不存在,不截断它?

时间:2015-07-17 19:29:07

标签: c++ iostream fstream c++03

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,然后立即关闭它并打开我真正想要的流,但如果单个流对象可以避免这种情况,那么这似乎很麻烦。

3 个答案:

答案 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_TRUNCO_APPEND或其他一些标志,但可以说所有文件都应该使用O_CLOEXEC | O_LARGEFILE打开,但那不是重点)

在libc层,没有标准mode字符串暗示O_CREAT没有O_TRUNC。但是,您可以使用open后跟fdopen

在C ++库级别,没有传递所需标志的标准方法。但是,使用特定于实现的类/函数或第三方库,它是可能的;见alert dialog with gray below.

就个人而言,我倾向于在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进行阅读。但是,所有的写入都将是 附加到文件末尾。

因此,除非您需要执行写操作,否则此开放模式将适合您的账单 现有数据。