Могу ли я использовать FILE * для инициализации объекта C ++ ostream? - PullRequest
3 голосов
/ 18 июля 2011

Могу ли я использовать в другом месте открыт

FILE* f = ...

что инициализировать какой-то std::ostream экземпляр? Вот так (псевдокод):

FILE *f = ...;
std::ostream os;
os./*bind_to_f*/( f );    // HOW?
os << "Hello world" << std::endl;

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

FILE* и потоки имеют возможности ввода / вывода в стиле C и C ++ соответственно.Поскольку библиотека C ++ не всегда знает о реализации базовой библиотеки C, нет способа сделать это.Кроме того, подумайте, какой была бы семантика владения, если бы вы могли это сделать?

2 голосов
/ 18 июля 2011

Если бы вы создали класс streambuf, который использовал бы FILE * внутри, вы могли бы сделать это. Например, HP OpenVMS , похоже, имеет такой класс.

2 голосов
/ 18 июля 2011

С помощью GCC вы можете просто передать существующий дескриптор файла конструктору ( ref ):

FILE *f = ...;
std::ofstream os(fileno(f));

Конструктор: ofstream :: ofstream (int fd)

Создать офстрим для записи в файл, который уже был открыт, используя дескриптор файла fd.

...