尝试将fmemopen文件描述符与stdin关联时出现错误的文件描述符错误

时间:2018-09-22 03:28:47

标签: c input io shared-libraries file-descriptor

我正在尝试插入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 :(得分:1)

我不清楚您从哪里得知应该尝试像这样替换stdin的文件描述符。它不能那样工作,因为fmemopen的全部要点在于它后面没有底层文件(因此也没有文件描述符);这只是内存缓冲区对stdio API的改编。

幸运的是,我看不出您需要或想要重新映射文​​件描述符以执行所需操作的原因。如果您要截获fscanf并使用不同的vfscanf参数重新调用FILE*,则stdin不会被使用,因此对其进行任何更改都将无效。 / p>

答案 1 :(得分:1)

fmemopen(3)写道:

  

注释

     

没有文件描述符与返回的文件流关联   通过此函数(即,如果调用fileno(3)将返回错误   返回的流)。