2012-05-22 6 views
0

У меня есть требование, где в нем есть глобальныйFILE указатель/дескриптор. Одна из функций будет считываться из этого указателя/дескриптора. внутренний указатель связанный с FILE указатель/дескриптор авансов. После того, как эта функция вернется, Я хочу прочитать от того же FILE указатель/дескриптор, а также те же данные, что и другая функция чтения.Сохранение/дублирование указателя/дескриптора файла

Но я не могу прочитать те же точные данные, что и внутренний указатель. Дублирование дескриптора не работает как дубликат зеркал оригинала. Сохранение указателя FILE перед чтением также не работает, поскольку оно является указателем и снова начнет ссылаться на одно и то же.

Один из вариантов заключается в сохранении позиции файла с использованием fgetpos() перед чтением и использованием fsetpos() перед следующим чтением.

Но это работает для указателей файлов, а не для дескрипторов.

С обычными указателями это так просто. Но с FILE вещи становятся сложнее.

Есть ли другие не-неуклюжие способы достижения этой цели?

+0

'man lseek' для дескрипторов файлов –

+0

Почему вы хотите дважды прочитать данные? Это неудобно, и любой способ сделать это будет по своей сути неуклюжим. –

+0

@WilliamPursell Сценарий заключается в том, что я должен регистрировать данные для отладки и использовать их для других целей. –

ответ

1

Если вы имеете в виду дескрипторы файлов POSIX, похоже, что вы ищете lseek().

off_t off; 

off = lseek(fd, 0, SEEK_CUR); /* get current offset */ 
/* do some read(s) */ 
lseek(fd, off, SEEK_SET); 
+0

Не будет работать: 'dup''d fd разделяет смещение оригинала. –

+0

Справа. Возможно, я не понимаю вопроса - я думал, что нужно искать обратно, чтобы те же самые данные могли быть прочитаны снова. В этом случае я не уверен, почему (или даже если) есть 'dup()' 'ed fd вообще. – FatalError

0

другой вариант был бы для карты памяти, используя mmap().

Это позволит вам произвольно читать любую позицию в файле без использования lseek() или fseek().

вы найдете краткое руководство по mmap() на linuxquestions

0

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

Смежные вопросы