便携式fstream文件路径的正确语法是什么?

时间:2015-03-04 11:41:11

标签: c++ file-io fstream

我一次又一次地看到这个恼人的问题。请您分享您的知识,这可能有助于我们找到答案。

我的困惑是,正斜杠是posix标准,但操作系统的目录结构是不同的。

谢谢

便携式fstream文件路径的正确语法是什么?

(例如,您将传递给std :: fstream:open()以打开文件的字符串。)

一个。 " ::目录:file.bin"

B中。 " C:/Directory/File.bin"

℃。 " /directory/file.bin"

d。 " C://Directory//File.bin"

电子。 std:fstream文件路径不可移植。

4 个答案:

答案 0 :(得分:4)

E :不可移植,即实施定义

答案可以在std::fopen文档中找到:( fstream通过filebuf::open引用)

  

注释

     

文件名的格式是实现定义的,而不是   必须指一个文件(例如它可能是控制台或另一个   设备可通过文件系统API访问)。在支持的平台上   它们,filename可以包括绝对或相对文件系统路径。

答案 1 :(得分:4)

我们和其他许多人热切期待的是文件系统技术规范:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4099.html

这主要是将boost/filesystem导入C ++标准。

技术规范已作为C ++ experimental部分的一部分提供。但是,默认情况下,这不是在gcc 4.9.2或Visual Studio 2013中实现的。

希望它能在即将到来!

您可以在此处查看更多信息:http://en.cppreference.com/w/cpp/experimental/fs

您专门寻找的是pathhttp://en.cppreference.com/w/cpp/experimental/fs/path

现在通过回答您的问题,如果您正在寻找这样做,则需要使用#ifdef并在每个目标平台上实施您的代码。

答案 2 :(得分:1)

(E) - 没有便携式标准,因为不同的文件系统和操作系统有不同的期望和限制。 fstream不会将您限制在所有实际实施的最低始终支持的子集中,或者您只能编写" 8.3"文件名到当前工作目录;-P

也就是说,如果您对此问题空间感兴趣,那么您可能想要查看boost filesystem library,这不是标准版,但是在最不为人知的....

答案 3 :(得分:0)

路径不可移植。尝试使用可移植语法是徒劳的,因为您提出的任何文件都可能无法在未来的文件系统之间移植。但是,应该可以执行以下操作之一:

  1. 设计您的应用程序,以便您不需要存储路径。
  2. 使用您自己的路径格式,您可以将其转换为当前系统上的路径。
  3. 将应用程序使用的路径限制为可移植(在Windows / Linux之间)子集(例如:以“/”作为路径分隔符的相对路径)
  4. 为同一路径存储多个版本,并在每个支持的操作系统上使用正确的版本。
  5. 存储一种形式的路径(例如Linux路径)并使用简单的方案转换为例如:Windows路径。记录此方案,以便用户了解路径的解释方式。
  6. 我在这里写了更多内容:https://stackoverflow.com/a/40980510/2345997