Ошибка неверного дескриптора файла при попытке связать дескриптор файла fmemopen с stdin - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь вставить функцию 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 ]

0 голосов
/ 22 сентября 2018

fmemopen (3) wrote:

ПРИМЕЧАНИЯ

Нет дескриптора файла, связанного с потоком файлов, возвращаемого этимфункция (то есть fileno (3) вернет ошибку при вызове в возвращаемом потоке).

0 голосов
/ 22 сентября 2018

Мне непонятно, откуда у вас идея, что вам следует попробовать заменить дескриптор файла на stdin следующим образом.Это не может работать таким образом, потому что весь смысл fmemopen в том, что за ним нет основного файла (и, следовательно, нет файлового дескриптора);это просто адаптация буфера в памяти к API stdio.

К счастью, я не вижу причин, по которым вам нужно или вы хотите переназначить файловые дескрипторы, чтобы делать то, что вы хотите.Если вы перехватываете fscanf и повторно вызываете vfscanf с другим аргументом FILE*, stdin не используется, поэтому любые изменения в нем не будут иметь никакого эффекта.

...