c++ - 读取 istream 的名称

标签 c++ casting file-extension istream

我有类似的东西:

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

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

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

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

最佳答案

你几乎肯定确实使用过

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() 存储的对象,但这样做并不简单。

关于c++ - 读取 istream 的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21509857/

相关文章:

c++ - C++ 中的上下文选择功能

c++ - 读取 UART 流 - 数据分块

在 C 中转换指向 int 的指针

将内存转换为结构指针

c++ - 代码生成 - usleep 与 std::this_thread::sleep_for

c++ - 如何将 std::string 分配给我类(class)中的其他 std::string(overload = for string object)。如何加载 .ini 文件

java - 获取 Java 方法分派(dispatch)的通配符对象的类型?

python - 使用python进行文件扩展名验证

filenames - 点文件有文件扩展名吗?

java - 检查文件是否属于某种类型