【问题标题】:Getting filename (or path) from fstream从 fstream 获取文件名(或路径)
【发布时间】:2012-06-02 03:45:02
【问题描述】:

我可以从fstream 对象中获取文件名或其路径吗?我查看了fstream的方法,并没有找到任何接近它的东西。

【问题讨论】:

  • 我认为这不可能。底层文件可能有多个名称(如果它有多个硬链接)或根本没有名称(例如,如果它表示匿名管道)。

标签: c++ file-io fstream


【解决方案1】:

不,这是不可能的,至少在符合标准的库实现中是不可能的。

fstream 类不存储文件名,也不提供任何检索它的函数。

因此,跟踪此信息的一种方法是将std::map 用作:

std::map<std::fstream*, std::string> stream_file_table;

void f()
{
  //when you open a file, do this:
  std::fstream file("somefile.txt");

  stream_file_table[&file] = "somefile.txt"; //store the filename

  //..
  g(file);
}
void g(std::fstream & file)
{
    std::string filename = stream_file_table[&file]; //get the filename
    //...
}

或者,也可以简单地传递文件名。

【讨论】:

  • 这看起来没问题,只是你需要说一旦 fstream 对象被销毁就必须删除该名称...
  • 完全有可能符合标准包含一种检索用于打开文件的文件名的方法。这称为扩展。
  • @Clearer 没有人说它会不符合标准。关键是标准没有规定。
  • @bloody 它说“至少在符合标准的实现中不”,这听起来像是拥有该功能会使其不符合
  • 扩展不是标准的一部分。如果您使用这些功能,那么您的代码不再符合标准。如果您更改编译器,那么您的代码可能无法编译,因为您的新编译器可能缺少您在代码中使用的扩展。
【解决方案2】:

您还可以设计一个小类,它继承自 fstream,其行为类似于 fstream,但也存储其文件名。

【讨论】:

  • 这还允许您添加一个方便的构造函数,采用 std::string,这在 C++11 中是必需的,但在 C++03 实现中通常不存在。
  • 或者,如果不关心可重用性和/或可扩展性,则可以使用一个简单的结构来存储字符串和文件流对象。
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2015-04-22
  • 2014-07-24
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多