2014-02-02 3 views
2

У меня есть что-то вроде этого:Прочитайте название из IStream

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

Итак, для проверки файла расширения, необходимо, чтобы получить имя файла. Я использую свою собственную функцию чтения:

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

Это можно получить /path/to/my/file.ppm в строке из IStream & переменных?

+2

Как поток istream является потоком ввода общего назначения (и не обязательно связан с файлом), ответ - нет. –

+0

Вы можете создать карту имени файла для указателя или reference_wrapper для 'ifstream'. – juanchopanza

+0

что-то вроде карты ? У меня только один файл, я не думаю, что нужно использовать карту – user3243742

ответ

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(), могут поддерживаться с использованием различных обратных вызовов, но это нетривиально.