Если у меня есть буфер, содержащий данные файла, как я могу получить из него дескриптор файла? Это вопрос, полученный из как распаковать файл в памяти
Как получить файловый дескриптор буфера в памяти?
Ответ 1
Я написал простой пример, как сделать filedescriptor в область памяти:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
char buff[]="qwer\nasdf\n";
int main(){
int p[2]; pipe(p);
if( !fork() ){
for( int buffsize=strlen(buff), len=0; buffsize>len; )
len+=write( p[1], buff+len, buffsize-len );
return 0;
}
close(p[1]);
FILE *f = fdopen( p[0], "r" );
char buff[100];
while( fgets(buff,100,f) ){
printf("from child: '%s'\n", buff );
}
puts("");
}
Ответ 2
Невозможно на простом C. В простом C все обращения к файлам осуществляются через дескрипторы FILE *
и они могут быть созданы только с помощью fopen()
и freopen()
и в обоих случаях должны указывать путь к файлу. Поскольку C пытается быть максимально переносимым, он ограничивает ввод-вывод абсолютным минимальным значением, которое, возможно, все системы могут каким-либо образом поддерживать.
Если у вас есть API POSIX (например, Linux, macOS, iOS, FreeBSD, большинство других систем UNIX), вы можете использовать fmemopen()
:
char dataInMemory[] = "This is some data in memory";
FILE * fileDescriptor = fmemopen(dataInMemory, sizeof(dataInMemory), "r");
Это настоящий дескриптор файла, который можно использовать со всеми API-интерфейсами C файлов. Также следует разрешить поиск, что невозможно, если вы работаете с трубами, так как каналы не поддерживают поиск (вы можете эмулировать поиск вперед, но нет способа когда-либо искать назад).
Ответ 3
Вы не можете. В отличие от С++, модель ввода-вывода файлов C не открыта для расширения.