是否可以在ios :: in&和ios不存在的文件上打开fstream ios :: out没有出错?
答案 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:app
或fstream::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
以创建不存在的输出文件。