【问题标题】:Preventing std::ifstream from creating an empty file防止 std::ifstream 创建空文件
【发布时间】:2021-03-22 09:24:40
【问题描述】:

如果找不到具有所提供路径的文件,则以下代码将创建一个空文件:

std::ifstream file;
file.open(path, std::ios::in | std::ios::binary | std::ios::app);
//file.open(path, std::ios::in | std::ios::binary); will set fail() to true

if (!file.is_open())
    throw std::runtime_error("File could not be opened."); //never reached

file.seekg(0, file.end);
size_t size = file.tellg();
file.seekg(0, file.beg);

char* buffer = new char[size];
file.read(buffer, size);
file.close();

if (file.fail()) 
    throw std::runtime_error("Error reading file."); //why with only std::ios::in | std::ios::binary?

有没有办法避免ifstream 的这种行为?如果找不到文件,我需要使操作失败,但它总是成功。对于这种行为,我是否必须退回到fopen

【问题讨论】:

  • 如果你以阅读模式打开它,那应该做你想做的事

标签: c++ c++11 file-io fstream iostream


【解决方案1】:

This std::basic_filebuf::open reference 包含一个方便的表格,不同标志会发生什么。正如您所看到的,每次使用 app 时,行为是在新文件不存在时创建一个新文件。

有一种解决方法:使用app 标志打开而不。这样打开会失败,然后您可以检查。如果没有失败,则关闭文件并使用app 再次打开。

【讨论】:

  • 谢谢! app 在那里,否则如果我只传入in | binary,则在读取整个文件后我会得到fail 状态。奇怪的是in | out | binary 失败状态消失了。知道为什么会这样吗?我已经发布了整个代码。
  • out 标志使不存​​在的文件不再是问题,因为它可以为您创建一个。
  • @EnigmaticBacon 失败在于现有文件。如果我只设置inbinary 标志,文件会正确打开,并且报告的大小是正确的,但fail() 返回true。设置app 标志或设置out 标志都不会发生这种情况。为什么?
  • @InBetween 当然,在以只读模式打开整个文件后,您会收到“失败”。这就是重点。 :)
  • 读取不存在的数据自然会失败。这是一个特点。 :)
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2020-04-19
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多