【问题标题】:Why are good() and is_open() returning true on Mac if a file does not exist?如果文件不存在,为什么 good() 和 is_open() 在 Mac 上返回 true?
【发布时间】:2022-01-23 03:29:00
【问题描述】:

在 Windows(使用 gcc)上,下面的代码按预期打印0 0如果传递的文件名是现有目录的路径,即没有实际文件的路径(实际上,没有文件可以打开阅读)。

在 Mac(使用 Xcode)上,它会打印 1 1!怎么可能?为什么good()is_open() 在Mac 上都返回true? Xcode clib 有问题,还是我忽略了一些细节?

#include <fstream>

int main(void)
{
    std::ifstream file("filename", std::ios::binary);

    cout << file.good() << " " << file.is_open();
}

【问题讨论】:

  • 如果您使用std::ios::binary | std::ios::in,它会告诉您什么(在 Mac 上)?
  • @rturrado -- 没关系; std::ifstream 是一个输入流,即使您指定了其他选项。
  • @PeteBecker 正确,谢谢!
  • 我怀疑某些基于 Unix 的系统允许您成功打开文件夹的句柄,就好像它是一个普通文件一样。您可以使用std::filesystem::is_directory 来检查路径是否为文件夹。
  • 如果您有一个名为filename 的目录,在某些操作系统上,您可以打开该目录作为文件 并从中读取。它将包含其内容项(以二进制格式)。这就是你想要做的吗?

标签: c++ xcode fstream


【解决方案1】:

在引擎盖下:

  • 在 Windows 上,ifstream 最终将使用 CreateFile(),它可以打开一个目录只有如果指定了 FILE_FLAG_BACKUP_SEMANTICS 标志,ifstream 不太可能使用。

  • 在其他平台上,ifstream 很可能使用fopen(),只要请求的访问权限是只读的,它就可以打开一个目录,ifstream 也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2016-07-13
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多