std::fstream不会创建文件。

39

我正在尝试使用std::fstream进行文件输入输出,并且希望在文件不存在时创建该文件。

  std::fstream my_stream
  my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);
  if(!my_stream)
      std::cout<<"error"<<strerror(errorno);

我得到了这个结果:"没有该文件或目录。" 在这种情况下,我该如何创建文件?
3个回答

55

在调用fstream::open()时,您指定了std::fstream::in。 这已经被知道会强制要求存在一个文件。

要么从您的mode参数中删除std::fstream::in,要么除其他标志外还指定std::fstream::trunc


26
而且请注意,每次使用“trunc”都会创建一个空文件。 - Bo Persson
4
但是,如果我想打开文件进行读写并创建文件(如果不存在),该怎么办?标准的libc open()可以通过指定O_CREAT标志来实现。在C++中是否不可能实现这一点? - Kai Petzke

15

这里有点混乱,但是它可以工作。如果文件已存在,则不会覆盖该文件,但是如果第一次打开失败,则会创建一个新文件。

std::fstream my_stream
my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);

if(!my_stream)
{
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::trunc | std::fstream::out);    
    my_stream.close();
    // re-open with original flags
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);
}
else
{
    // read something
} 

// read/write here

你可以删除第二个close()。只需使用标志“binary | in | out | trunc”打开它即可正常工作。 - TorbenC
1
很晚了,但是,难道下面的代码:my_stream.open("my_file_name",std::fstream::binary | std::fstream::trunc | std::fstream::out);不能简写成my_stream.open("my_file_name", std::ios::out);吗?这只是为了暂时创建文件... - user2962533

0
你可以从std::basic_filebuf::open查看参考资料。
如果你使用的是默认模式out|in,相当于在fopen中使用r+作为访问模式,所以它不能创建新文件。
因此,如果你想创建一个既能读又能写的新文件,你可以使用in|out|trunc作为w+
如果文件存在,你可以使用in|appin|out|app作为a+来创建或写入文件末尾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接