读取istream的名称

时间:2014-02-02 11:11:50

标签: c++ casting file-extension istream

我有类似的东西:

istream ifs("/path/to/my/file.ppm", ios::binary);

现在,为了检查扩展文件,需要获取文件的名称。 我正在使用自己的函数读取:

 ... readPPM(std::istream& is) {}

可以从istream&中获取字符串中的/path/to/my/file.ppm。变量?

1 个答案:

答案 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()一起存储的对象,但这样做并非易事。