我可以从 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()));
}
我需要知道 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()));
}