Вы ожидаете работать на эту компанию навсегда? Если Вы когда-либо будете отсутствовать на рынке труда, то pehaps некоторые возможные работодатели будет знать парадокс Python .
Если переносимость для вас не важна, вы можете взглянуть на fmemopen и open_memstream . Это расширения GNU, поэтому они доступны только в системах glibc. Хотя похоже, что они являются частью POSIX.1-2008 ( fmemopen и open_memstream ).
Я не уверен, возможно ли непереносимое расширение объектов FILE
, но если вы ищете что-то более дружественное к POSIX, вы можете использовать pipe
и fdopen
.
Это не совсем то же самое, что иметь ФАЙЛ *
, который возвращает байты из буфера, но это определенно ФАЙЛ *
с программно определяемым содержимым.
int fd[2];
FILE *in_pipe;
if (pipe(fd))
{
/* TODO: handle error */
}
in_pipe = fdopen(fd[0], "r");
if (!in_pipe)
{
/* TODO: handle error */
}
Оттуда вы захотите записать свой буфер в fd [1]
, используя write ()
. Однако будьте осторожны с этим шагом, потому что write ()
может блокироваться, если буфер канала заполнен (т.е. кто-то должен прочитать другой конец), и вы можете получить EINTR
, если ваш процесс получает сигнал во время записи. Также обратите внимание на SIGPIPE
, что происходит, когда другой конец закрывает трубу. Возможно, для вашего использования вы можете захотеть выполнить запись
буфера в отдельном потоке, чтобы избежать блокировки и убедиться, что вы обрабатываете SIGPIPE
.
Конечно, этого не произойдет. создать доступный для поиска ФАЙЛ *
...
Я не уверен, что понимаю, почему вы хотите испортить FILE *. Не могли бы вы просто записать в файл, а затем загрузить его в виде строки?
char *get_file_in_buf(char *filename) {
char *buffer;
... get file size with fseek or fstat ...
... allocate buffer ...
... read buffer from file ...
return buffer;
}
Если вы хотите только «записать» форматированный текст в строку, другим вариантом может быть обработка расширяемого буфера с помощью snprintf ()
(см. Ответы на этот вопрос SO, чтобы узнать, как с этим справиться: Возобновление [vf]? Nprintf после достижения предела ).
Если вместо этого вы хотите создать тип которые можно прозрачно передать любой функции, использующей FILE *
, чтобы заставить их работать со строковыми буферами, это гораздо более сложный вопрос ...