Ошибка неверного дескриптора файла при попытке связать дескриптор файла fmemopen с stdin
Я пытаюсь вставить fscanf
функция, которая первоначально читает из stdin
лайк fscanf(stdin,"%ms", &secret)
, В моей вставленной функции я пытаюсь заставить ее читать из входного файла, который я создал с символьной строкой. Вот что я делаю:
int fscanf(FILE *stream, const char *format, ...){
FILE * in ;
char * buffer = "secretString";
size_t length = strlen(buffer);
in = fmemopen(buffer, length, "r");
if (in== NULL){
handle_error("fmemopen");}
// This is the part where I'm trying to feed my file as stdin
// since original fscanf expects stdin which I'm trying to hack
int dptr = fileno(in);
dup2(dptr, 0);
va_list args;
va_start(args, format);
int p = vfscanf(in, format, args);
va_end(ap);
fclose(in);
return p;
}
Тем не менее, я получаю Bad file descriptor
ошибка. Буду признателен, если кто-нибудь скажет мне, что я делаю не так.
2 ответа
Я не понимаю, откуда у вас идея, что вы должны попытаться заменить дескриптор файла для стандартного ввода, как это. Это не может работать таким образом, потому что весь смысл fmemopen
в том, что за ним нет основного файла (и, следовательно, нет файлового дескриптора); это просто адаптация буфера в памяти к API stdio.
К счастью, я не вижу причин, по которым вам нужно или хотите переназначить файловые дескрипторы, чтобы делать то, что вы хотите. Если вы перехватываете fscanf
и перезвонить vfscanf
с другим FILE*
аргумент, stdin
не привыкать, поэтому любые изменения к нему не будут иметь никакого эффекта.
fmemopen(3) написал (а):
ЗАМЕТКИ
Не существует файлового дескриптора, связанного с потоком файлов, возвращаемым этой функцией (т. Е. Fileno(3) вернет ошибку при вызове в возвращенном потоке).