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

vla*_*378 5 c++ fstream

我需要知道ifstream中是否存在方法,因此我可以获得与其关联的文件的名称.

例如

void some_function(ifstream& fin) {
    // here I need get name of file
}
Run Code Online (Sandbox Code Playgroud)

ifstream/ofstream中是否有方法可以获得该方法?

Dav*_*aim 5

否.C++流不保存文件的名称或路径.但是,既然你需要一些字符串来初始化流,你可以保存它以备将来使用.


πάν*_*ῥεῖ 5

如上所述,没有提供这样的方法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):
}
Run Code Online (Sandbox Code Playgroud)

另一种选择, - 如果你不能使用另一个类传递给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()));
}
Run Code Online (Sandbox Code Playgroud)