Я пытаюсь открыть существующий файл в режиме «rb», и мне нужно расшифровать, возвращая новый ФАЙЛ * без перезаписи исходного файла или создания нового временного. Короче говоря, мне нужно что-то вроде этого:
FILE *decrypt(){
FILE *cryptedfile = fopen("file.ext", "rb");
//... my decrypter code
return (the decrypted file as FILE*).
}
Итак, есть способ сделать что-то вроде "cast char * to FILE *"?
Я безуспешно пробовал много разных решений, я также пытался создать новый tmpfile (), но результат, похоже, не работает должным образом, и я все равно не хочу создавать tmpfile, просто сохраните его в памяти.
Благодарность:)
Вы уже «конвертировали» свой const char* в FILE*, когда звонили в fopen.
Конечно, мой код дешифратора обработает содержимое файла и вернет его как char *, но мне нужно снова преобразовать его в FILE *, не сохраняя его.
return (the decrypted file as FILE*)., тогда вам нужно создать новый файл, который будет расшифрован, и записать в него, закрыть его, а затем снова открыть для чтения. Кажется странным или, по крайней мере, небезопасным требованием.
Почему? Для чего нужен FILE *? Что плохого в том, что char * указывает на расшифрованные данные?
мне нужен FILE *, а не char *, потому что я использую сторонний код, который требует FILE * для выполнения других процессов. :(
я не хочу создавать новый временный файл, так как зашифрованные данные ценны: \
Если вы используете POSIX-совместимую систему, вы можете использовать fmemopen().
Кроссплатформенность: github.com/Snaipe/fmem
Тот же вопрос: stackoverflow.com/q/24683052/3002139
Возможные дубли: stackoverflow.com/q/5135854/3002139stackoverflow.com/q/539537/3002139





После расшифровки данных вы можете создать канал для передачи расшифрованных данных, а затем вы можете вернуть прочитанный конец канала для чтения данных.
FILE *decrypt(){
FILE *cryptedfile = fopen("file.ext", "rb");
char *data;
int len;
// load decrypted data into "data" and length info "len"
int p[2];
if (pipe(p) == -1) {
perror("pipe failed");
return NULL;
}
int rval;
if ((rval = write(p[1], data, len)) == -1) {
perror("write failed");
close(p[0]);
close(p[1]);
return NULL;
} else if (rval < len) {
printf("write failed, wrote %d, expected %d\n", rval, len);
close(p[0]);
close(p[1]);
return NULL;
}
return fdopen(p[0], "r");
}
В качестве альтернативы вы также можете использовать fmemopen:
FILE *decrypt(){
FILE *cryptedfile = fopen("file.ext", "rb");
char *data;
int len;
// load decrypted data into "data" and length info "len"
return fmemopen(data, len, "rb");
}
Что произойдет, если расшифрованные данные больше, чем буфер канала?
@Shawn Если это произойдет, вы получите сообщение об ошибке записи. В Linux по умолчанию установлено значение 64 КБ, но его можно увеличить с помощью fcntl, используя опцию F_SETPIPE_SZ.
Спасибо всем за эти ответы за такое короткое время @dbush. Я попробовал ваш код, и он работает, но, похоже, работает только в том случае, если char * не содержит пробелов. если данные содержат пробел, программа продолжает работать, ничего не делая.
@ Джузеппе рад, что смог помочь. Не стесняйтесь [принять этот ответ [(stackoverflow.com/help/accepted-answer), если вы сочли его полезным.
извините, не пробелы, но возвращает символ типа "\ n"
Я объясню, например: если я установил data = "helloworld" и len = 10, он работает отлично. но если data = "hello world" и len = 11, программа ничего не делает; но если len = 5 (до «o» в «hello»), он работает, записывая только слово «hello». что случилось?
Я исправил заменой pipe (p) на _pipe (p, len, O_BINARY)
Единственный способ получить действующий
FILE *- использоватьfopen. Почему бы вам просто не вернуть расшифрованное содержимое в виде массива байтов?