我有类似的东西:
istream ifs("/path/to/my/file.ppm", ios::binary);
现在,为了检查扩展文件,需要获取文件的名称。 我正在使用自己的函数读取:
... readPPM(std::istream& is) {}
可以从istream&中获取字符串中的/path/to/my/file.ppm。变量?
答案 0 :(得分:2)
你几乎肯定使用过
std::ifstream ifs(...);
// ^
然而,即使这样,流也不会保留用于打开它的名称:很少需要这样做,这对于大多数应用程序来说都是浪费的资源。也就是说,如果您稍后需要该名称,则需要保留该名称。此外,并非所有流都有名称。例如,std::istringstream
没有名称。
如果您无法将流的名称与流分开,则可以附加名称,例如,使用pword()
成员:
int name_index() {
static int rc = std::ios_base::xalloc(); // get an index to be used for the name
return rc;
}
// ...
std::string name("/path/to/my/file.ppm");
std::ifstream ifs(name, ios::binary);
ifs.pword(name_index()) = const_cast<char*>(name.c_str());
// ...
char const* stream_name = static_cast<char*>(ifs.pword(name_index()));
流不会将指针保持为任何形状或形式,即,通过上述设置,name
需要比ifs
对象更长。如果需要,可以使用各种回调来维护与pword()
一起存储的对象,但这样做并非易事。