Единственным общим идентификатором, не зависящим от perhaos OS, является путь к файлу или имя самого устройства, но объекты iostream не предоставляют доступ к этой информации.
Одним из решений является создание подкласса объекта потока и предоставление необходимых вам функций. Неудовлетворительный образец:
class id_fstream : public std::fstream
{
public :
id_fstream( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out ) :
fstream( filename, mode ), m_filename( filename)
{
// do nothing
} ;
const std::string& filename()
{
return m_filename ;
}
private :
std::string m_filename ;
} ;
Затем вы можете написать код, такой как:
if( id_fstreamA.filename() == id_fstreamB.filename() )
{
...
}
Однако это не работает, если один файл был открыт с другим относительным или абсолютным путем или через псевдоним. Вы можете решить эту проблему, получив текущий рабочий каталог с помощью специального вызова ОС и, тем самым, разрешив полный путь к любому неабсолютному пути.