【问题标题】:Is the behaviour of ifstream::ifstream on directories well-defined?ifstream::ifstream 在目录上的行为是否定义明确?
【发布时间】:2019-03-15 14:49:48
【问题描述】:

根据C++11标准,是

的行为
ifstream in(".");

指定的,还是系统相关的?

就上下文而言,我试图避免使用boost::filesystem 和类似的库,因为它们会导致不相关的可移植性问题。

编辑:根据我能找到的,我应该得到一个有效的 ifstream(当且仅当目录存在时才是'good()'。这可能提供了一种比使用更便携的方式来测试目录是否存在boost::filesystem 因为后者需要你链接更多的库。

【问题讨论】:

  • 你希望它做什么?
  • 目录是 Unix 上的文件。见unix.stackexchange.com/questions/197439/…
  • @NathanOliver 我指定 C++ 11 是有原因的……
  • 对不起,我没有看到标题中的标签。我已经编辑它以从标题中删除标签,而是用c++11 标记 Q
  • C++ 标准根本没有提到目录或 Unix。如果你想让你的程序在 Unix 上运行,你需要一些东西来保证你在 Unix 上的行为。 C++ 标准不是这样的文档。实际上,如果您将std::ios_base::in 指定为打开模式,您可能会得到good() 流。不过,您不太可能从中得到任何好的reads。

标签: c++ c++11 language-lawyer


【解决方案1】:

该标准似乎在其散文中的任何地方都没有提到“目录”的概念。提到了 EISDIR errno 和镜像 posix 的一般意图,但仅“可能用于报告低级条件”。我会说依赖于系统而不是可移植的。

【讨论】:

  • 委员会希望在某个时候纠正这个问题。有一个技术规范来解决它。编程语言——C++——文件系统技术规范open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4100.pdf,但它似乎没有进入 C++17。
  • @RichardChambers 很有趣。这明确地表明 dir 是一个文件。
  • @Mohan 最好将其视为filesystem 技术规范说filesystem 函数将目录呈现为文件。谁知道底层操作系统操作系统在做什么,以及标准库为了提供该规范的接口而在底层跳过了什么。
【解决方案2】:

根据我能找到的,我应该得到一个有效的ifstream(当且仅当目录存在时,good()

标准不保证该结果。我不会将它用作检查目录是否存在的机制。

当您仅限于使用 C++11 时,最好的选择是使用由适当的预处理器宏包围的平台相关 API 调用。

#if  defined(_WINDOWS)
// Use Windows specific APIs
#elif defined(_Linux)
// Use Linux specific APIs
#elif defined(_MacOS) ???
// Use MacOS specific APIs
#endif

更多信息:

对于 Windows:How do you check if a directory exists on Windows in C?
对于 Linux:Checking if a directory exists in Unix (system call)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2014-04-02
    • 2017-09-06
    • 2011-03-31
    相关资源
    最近更新 更多