fstream输入和输出不存在的文件

时间:2010-05-24 10:14:50

标签: c++ fstream

是否可以在ios :: in&和ios不存在的文件上打开fstream ios :: out没有出错?

5 个答案:

答案 0 :(得分:9)

要在不存在输入和输出(随机访问)的文件上打开fstream而不会收到错误,您应该在{{3}中提供flags fstream::in | fstream::out | fstream::trunc (或open)致电。由于该文件尚不存在,因此以零字节截断文件并不是戏剧性的。

ios::in指定时,可能想要在打开不存在的文件时出错,因为您永远无法从在这种情况下,如此失败的流将在以后防止意外失败。

答案 1 :(得分:1)

#include <fstream> 

ofstream out("test", ios::out);
if(!out)
{
    cout << "Error opening file.\n";
    return 1;
}

ifstream in("test", ios::in);
if(!in)
{
    cout << "Error opening file.\n";
    return 1;
}

如果发生错误,则显示消息并返回一(1)。但是,可以只编译和执行ofstream out("test", ios::out);ifstream in("test", ios::in);而不会出现任何错误。无论哪种方式,都会创建文件 test

答案 2 :(得分:0)

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  fstream f("test.txt", fstream::in | fstream::out);
  cout << f.fail() << endl;
  f << "hello" << endl;
  f.close();    
  return 0;
}

此代码将打印1,如果不退出则不会创建“test.txt”文件。因此,如果没有出现错误,就无法在不存在的文件上打开和转发。

答案 3 :(得分:0)

std::fstream f("test.txt", std::ios_base::out);
f.close(); //file now exists always
f.open("test.txt", fstream::in | std::ios_base::out);
//f is open for read and write without error

我没有检查以确保它会在没有错误的情况下打开,但我对它应该非常有信心。

答案 4 :(得分:0)

不幸的是,您的问题的答案是:“否”,在单个C ++语句中是不可能的。

是的,很多人会回答,您可以使用组合标志fstream::in | fstream::out | fstream::trunc。但是那个答案是胡说八道。 fstream::trunc表示打开时输出文件将被截断为零。但是,为什么要打开一个 empty 文件进行读写?除极少数情况外,您需要一个文件作为某些应用程序数据的临时存储,并且需要先写入然后再读回,该标志组合没有用。

有些人建议先尝试使用fstream::in | fstream::out(并根据需要打开其他标志,例如fstream:appfstream::binary),然后检查文件的错误状态:如果文件无法打开,然后重试包括| fstream::trunc的打开操作。但是,此解决方案有几个警告。例如,如果您的文件系统是通过NFS挂载的,则由于暂时的网络问题,首次尝试以读/写模式打开文件可能会失败。如果第二次尝试(包括fstream::trunc标志的尝试)成功了,那么您到目前为止收集的令人不快的数据就会消失。

安全的解决方案是先打开文件以仅进行追加(如果不存在,则会创建该文件,但不会截断该文件),然后立即将其关闭并以读写方式再次打开它模式。这可以通过以下代码实现:注意,ofstream首先被构造,然后立即被丢弃。

std::string filename { "test.txt" };
(void) std::ofstream(filename, std::ostream::app);
std::fstream file(filename);

或者,如果您需要其他标志,例如binary,请使用:

std::string filename { "test.txt" };
(void) std::ofstream(filename, std::ofstream::app | std::fstream::binary);
std::fstream file(filename, std::fstream::in | std::fstream::out | std::fstream::binary);

我希望,在C ++ 25(或下一个标准)中,如果请求读写模式,他们最终会添加一个标记std::fstream::create以创建不存在的输出文件。