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

时间:2015-06-28 13:17:00

标签: c++ fstream

我需要知道ifstream中是否存在方法,以便我可以获得与其绑定的文件的名称。

例如

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

ifstream / ofstream中是否有允许获取该方法的方法?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

如上所述,std::fstream及其衍生物并未提供此类方法。 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())); } 指针及其相关文件名的关联映射: / p>

tobi@tobi-desktop ~/github/shoes4 $ bin/shoes -v
Shoes 4.0.0.pre4
tobi@tobi-desktop ~/github/shoes4 $ jruby -v
jruby 1.7.20 (1.9.3p551) 2015-05-04 3086e6a on OpenJDK 64-Bit Server VM 1.7.0_79-b14 +jit [linux-amd64]
tobi@tobi-desktop ~/github/shoes4 $ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
tobi@tobi-desktop ~/github/shoes4 $ uname -a
Linux tobi-desktop 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

答案 2 :(得分:0)

不,这种方法不存在。