Как я могу получить объект 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;
}
Я хотел бы данные в записываться в файл, фактически отправленный в правильном порядке (избегая чередующихся символов).
Любое предложение о том, как достичь этого, или для другого подхода, приветствуется.
Умные цитаты, как '«некий-файл»' шоу это не настоящий код. Извините за удаление и восстановление тега C. –
@WeatherVane Я не уверен, что вы ошибались. Это определенно вопрос о C++, тот факт, что он использует объекты, унаследованные от C, не должен быть релевантным. –
@MarkRansom Недавно я был замечен для удаления тега C, когда в вопросе упоминалось C. Здесь OP импортирует библиотеку в программу C. –