Создание ФАЙЛА * поток, который приводит к строке

Вы ожидаете работать на эту компанию навсегда? Если Вы когда-либо будете отсутствовать на рынке труда, то pehaps некоторые возможные работодатели будет знать парадокс Python .

5
задан Edmund 16 November 2009 в 10:01
поделиться

3 ответа

Если переносимость для вас не важна, вы можете взглянуть на fmemopen и open_memstream . Это расширения GNU, поэтому они доступны только в системах glibc. Хотя похоже, что они являются частью POSIX.1-2008 ( fmemopen и open_memstream ).

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

Я не уверен, возможно ли непереносимое расширение объектов 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 .

Конечно, этого не произойдет. создать доступный для поиска ФАЙЛ * ...

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

Я не уверен, что понимаю, почему вы хотите испортить 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 * , чтобы заставить их работать со строковыми буферами, это гораздо более сложный вопрос ...

0
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: