#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);
Надеюсь, это поможет.