Любой способ идентифицировать поток? - PullRequest
3 голосов
/ 23 октября 2011

Есть ли в C ++ способ идентифицировать файловый поток? Неважно, что это такое, поскольку два потока, созданные из одного и того же файла, имеют один и тот же идентификатор; все, что позволило бы мне сказать, что два потока, созданные из одного и того же файла, эквивалент (не равно ).

Ответы [ 3 ]

2 голосов
/ 23 октября 2011

Единственным общим идентификатором, не зависящим от 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() )
{
    ...
}

Однако это не работает, если один файл был открыт с другим относительным или абсолютным путем или через псевдоним. Вы можете решить эту проблему, получив текущий рабочий каталог с помощью специального вызова ОС и, тем самым, разрешив полный путь к любому неабсолютному пути.

0 голосов
/ 23 октября 2011

Я считаю, что такого пути нет.

Предполагается, что у программиста достаточно способов самостоятельно отслеживать различные потоки или он создает собственную структуру, например, для указания пути к файлу как string внутри этой структуры или чего-то подобного.например, у вас может быть такая структура:

struct FileStream {
    char* FilePath;
    istream FileStream;
}

А затем, чтобы увидеть, находятся ли два FileStream в одном файле, вы можете сделать что-то вроде:

myStringCompare(fs1.FilePath, fs2.FilePath);

Iнадеюсь, это поможет.

0 голосов
/ 23 октября 2011

Насколько я могу судить, нет встроенного способа сравнения двух файловых потоков.Вам придется либо сравнить два указателя, что потребует от вас отслеживания одинаковых потоков (что может быть невозможно в вашем случае, судя по формату вопроса), либо прочитать данные в обоих файловых потоках.и сравните это вместо этого.

...