【问题标题】:Can I get the name of file used from ifstream/ofstream?我可以从 ifstream/ofstream 中获取使用的文件名吗?
【发布时间】:2015-06-28 13:16:59
【问题描述】:

我需要知道 ifstream 中是否存在一个方法,以便我可以获取与之关联的文件的名称。

例如

void some_function(ifstream& fin) {
    // here I need get name of file
}

ifstream/ofstream 中是否有一个方法可以得到它?

【问题讨论】:

  • 不,不存在方法。
  • @anshabhi 也没有理由支持。通过查看reference documentation,可以轻松研究此信息。
  • @RedRoboHood 嗯?我认为该参考是完整的。
  • @πάνταῥεῖ 见this。总是有可能存在一个名称混淆的方法,其描述并没有明确其功能。
  • 我认为很多时候你有一些非标准的方式(“hack”)来做事。例如,我之前需要迭代 std::queue,但标准让我无法这样做。阅读一些堆栈溢出问题给了我这样做的技巧,我不能只看手册。这个问题很容易被谷歌搜索,但没关系..

标签: c++ fstream


【解决方案1】:

如前所述,std::fstream 没有提供这样的方法,它是派生的。 std::basic_filebuf 也没有提供这样的功能。

为简化起见,我在以下代码示例中使用 std::fstream 而不是 std::ifstream/std::ofstream


我建议自己在一个小助手类中管理底层文件名:

class MyFstream {
public:
    MyFstream(const std::string& filename) 
    : filename_(filename), fs_(filename) {
    }

    std::fstream& fs() { return fs_; }
    const std::string& filename() const { return filename_; }
private:
    std::string filename_;
    std::fstream fs_;
};

void some_function(MyFstream& fin) {
    // here I need get name of file
    std::string filename = fin.filename();
}

int main() {
    MyFstream fs("MyTextFile.txt");
    some_function(fs):
}

另一种选择——如果你不能使用另一个类来传递给some_function() 如上所述——可能是使用fstream* 指针及其关联文件名的关联映射:

class FileMgr {         
public:
     std::unique_ptr<std::fstream> createFstream(const std::string& filename) {
          std::unique_ptr<std::fstream> newStream(new std::fstream(filename));
          fstreamToFilenameMap[newStream.get()] = filename;
          return newStream;
     }
     std::string getFilename(std::fstream* fs) const {
         FstreamToFilenameMap::const_iterator found = 
              fstreamToFilenameMap.find(fs);
         if(found != fstreamToFilenameMap.end()) {
             return (*found).second;
         }
         return "";
     }
private:
     typedef std::map<std::fstream*,std::string> FstreamToFilenameMap;

     FstreamToFilenameMap fstreamToFilenameMap;
};

FileMgr fileMgr; // Global instance or singleton

void some_function(std::fstream& fin) {
     std::string filename = fileMgr.getFilename(&fin);
}

int main() {
    std::unique_ptr<std::fstream> fs = fileMgr.createFstream("MyFile.txt");

    some_function(*(fs.get()));
}

【讨论】:

  • 我在精神上喜欢你的第二个想法(尽管代码中有很多错别字,并且引用返回类型的return "" 非常糟糕:))。不过,面对搬家,恐怕行不通。考虑:std::unique_ptr&lt;std::fstream&gt; fs = fileMgr.createFstream("MyFile.txt"); std::fstream other = std::move(*(fs.get())); some_function(other);。映射将不再保留,"" 将被错误地返回。
  • 完成。但是我想不出一个很好的解决移动问题的方法。
【解决方案2】:

没有。 C++ 流不保存文件的名称或路径。 但是,由于无论如何您都需要一些字符串来初始化流,因此您可以将其保存以备将来使用。

【讨论】:

    【解决方案3】:

    不,这种方法不存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多