Вы почти наверняка на самом деле использовали
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()
, могут поддерживаться с использованием различных обратных вызовов, но это нетривиально.
Как поток istream является потоком ввода общего назначения (и не обязательно связан с файлом), ответ - нет. –
Вы можете создать карту имени файла для указателя или reference_wrapper для 'ifstream'. – juanchopanza
что-то вроде карты? У меня только один файл, я не думаю, что нужно использовать карту –
user3243742