Ошибка неверного дескриптора файла при попытке связать дескриптор файла 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) вернет ошибку при вызове в возвращенном потоке).

Другие вопросы по тегам