пользовательский Тип файла в C/C++

Люди говорят, что Словарь совпадает с хэш-таблицей.

Это не обязательно верно. Хэш-таблица является одним путем к реализация словарь. Типичный в этом, и это может быть по умолчанию в.NET в Dictionary класс, но это не по определению единственное.

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

7
задан Franck Freiburger 24 July 2009 в 09:24
поделиться

5 ответов

Если ваш «пользовательский поток» не является чем-то, что вы можете представить с помощью дескриптора файла или дескриптора файла, то вам не повезло. Тип FILE определяется реализацией, поэтому нет стандартного способа связать другие вещи с одним.

Если вы можете получить дескриптор файла C для того, что вы пытаетесь записать, тогда вы можете вызвать на нем fdopen , чтобы превратить его в ФАЙЛ * . Это не стандартные C или C ++, но они предоставляются Posix. В Windows это пишется _fdopen .

Если вы используете Windows и у вас есть HANDLE , то вы можете использовать _open_osfhandle , чтобы связать дескриптор файла с ним, а затем используйте оттуда _fdopen .

Вы действительно привязаны к fputs ? Если не, затем замените его использованием C ++ IOStream. Затем вы можете предоставить своего собственного потомка std :: basic_streambuf , обернуть его в std :: ostream и использовать на нем стандартный ввод-вывод C ++.

5
ответ дан 6 December 2019 в 14:08
поделиться

Нет, это не так. ФАЙЛ - это так называемый непрозрачный тип - в нем нет ничего, что можно было бы настроить.

6
ответ дан 6 December 2019 в 14:08
поделиться

Стандартного способа с интерфейсом FILE не существует. Обратите внимание, что код C ++ обычно должен использовать IOStream для ввода-вывода, с интерфейсом IOStream, решение вашей проблемы - написание пользовательского streambuf.

Если вы можете отказаться от соответствия стандарту, посмотрите документацию по вашей реализации.

  • POSIX имеет функцию popen (), которая создает ФАЙЛ * для чтения из вывода или записи на вход процесса;

  • В POSIX есть функция fdopen (), которая может создавать ФАЙЛ * из файлового дескриптора;

  • По крайней мере, для GNU libc, используемой Linux, существует возможность определения пользовательского потока C (см. Раздел «Программирование пользовательских потоков Awn» в информационной документации).

1
ответ дан 6 December 2019 в 14:08
поделиться

Если вы компилируете с библиотекой GNU C, вы можете использовать fmemopen (3):

fmemopen, open_memstream, open_wmemstream - открыть память как поток

3
ответ дан 6 December 2019 в 14:08
поделиться

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

0
ответ дан 6 December 2019 в 14:08
поделиться