Любой способ идентифицировать поток?

#c #stream #fstream

#c #поток #fstream

Вопрос:

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

Комментарии:

1. Можете ли вы уточнить, что вы подразумеваете под «идентификацией»?

2. Все, что позволило бы мне сказать, что два потока, созданные из одного и того же файла, эквивалентны.

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

4. @Ivan Конечно, но я искал что-то уже доступное в стандартных типах, если что-то подобное существует.

5. Я не думаю, что что-то подобное существует (см. Мой ответ ниже)… вероятно, есть библиотека, которая предоставляет то, что вы ищете.

Ответ №1:

Единственным общим идентификатором, который не зависит от операционной системы perhaos, будет путь к файлу или само имя устройства, но объекты iostream не предоставляют доступ к этой информации.

Одним из решений является подкласс объекта stream и предоставление необходимой функциональности. Неудовлетворительный пример:

 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::stringamp; filename()
        {
            return m_filename ;
        }

    private :
        std::string m_filename ;
} ;
 

Затем вы можете написать такой код, как:

 if( id_fstreamA.filename() == id_fstreamB.filename() )
{
    ...
}
 

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

Ответ №2:

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

Ответ №3:

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

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

 struct FileStream {
    char* FilePath;
    istream FileStream;
}
 

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

 myStringCompare(fs1.FilePath, fs2.FilePath);
 

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