我可以从 ifstream/ofstream 中获取使用的文件名吗?

Can I get the name of file used from ifstream/ofstream?

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

例如

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

ifstream/ofstream 中是否有一种方法可以做到这一点?

不,不存在这样的方法。

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

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

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


我建议您自己在一个小帮手中管理底层文件名class:

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):
}

另一种选择,- 如果您不能使用另一个 class 如上所述传递给 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()));
}