2017-01-25 2 views
2

Как я могу получить объект C++ streambuf из C FILE *, чтобы он использовал буфер объекта FILE, избегая обоих объектов для управления отдельными буферами, указывая на один и тот же базовый файл.Как создать объект C++ streambuf из C FILE *, совместно используя свой буфер (и состояние буфера) с объектом FILE?

Похоже, что нет стандартного способа сделать это.

Boost имеет класс stream_buffer, который имеет конструктор, содержащий дескриптор файла, позволяющий использовать функции C++ в файле, открытом с помощью кода C. Например:

boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> mysb (fileno(myFileptr), boost::iostreams::never_close_handle)); 

myFileptr быть типа FILE *. Проблема заключается в том, что mysb и объект FILE, на который указывает myFileptr, будут поддерживать отдельные буферы, поэтому это не вариант ...

Вот контекст моей проблемы. Я должен предоставить динамически связываемую библиотеку с C-интерфейсом (все экспортируемые переменные, аргументы функции и возвращаемые значения функций должны иметь типы C), но библиотека фактически разработана на C++.

Если экспортировать функцию, внутри с помощью C++ потока объектов, с этим прототипом

Void MyExportedFunct(FILE* myfile) 

И я импортировать библиотеку в программе C:

int main() 
{ 
    FILE * fptr = fopen(“SomeFile”, "w"); 
    fprintf(fptr, “Some data.”) 
    MyExportedFunct(fptr); 
    fprintf(fptr, “Some more data…”) 
    return 0; 
} 

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

Любое предложение о том, как достичь этого, или для другого подхода, приветствуется.

+0

Умные цитаты, как '«некий-файл»' шоу это не настоящий код. Извините за удаление и восстановление тега C. –

+0

@WeatherVane Я не уверен, что вы ошибались. Это определенно вопрос о C++, тот факт, что он использует объекты, унаследованные от C, не должен быть релевантным. –

+0

@MarkRansom Недавно я был замечен для удаления тега C, когда в вопросе упоминалось C. Здесь OP импортирует библиотеку в программу C. –

ответ

3

Существует (нестандартный, ищет ссылку сейчас) C++ streambuf, который является слоем поверх stdio, тогда было бы достаточно постоянно очищать буфер потока.

автоматического смыва часть переносимых осуществляется с помощью std::unitbuf:

mysb << std::unitbuf; 

Ааа, он называется stdio_filebuf и поставляется с C ССЗ ++ библиотека: __gnu_cxx::stdio_filebuf::stdio_filebuf constructor

+0

Как указывает @ ben-voigt, это расширение gcc. Нет никакого портативного способа сделать это. –

+2

@MarshallClow: Это неудачно, потому что стандартная библиотека абсолютно необходима для того, чтобы классы 'streambuf', которые располагались поверх' FILE * ', чтобы получить правильное' sync_with_stdio() 'поведение для' cin', 'cout',' cerr' и 'clog'.Эти классы просто не подвергаются стандартным образом для использования с другими файлами/потоками. –

+0

@BenVoigt: если объект C 'FILE' и объект' stdio_filebuf' имеют один и тот же базовый буфер, нет необходимости постоянно его очищать. Правильно? – Guett31