我正在尝试插入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
错误。如果有人能告诉我我在做什么错,我将不胜感激。
答案 0 :(得分:1)
我不清楚您从哪里得知应该尝试像这样替换stdin的文件描述符。它不能那样工作,因为fmemopen
的全部要点在于它后面没有底层文件(因此也没有文件描述符);这只是内存缓冲区对stdio API的改编。
幸运的是,我看不出您需要或想要重新映射文件描述符以执行所需操作的原因。如果您要截获fscanf
并使用不同的vfscanf
参数重新调用FILE*
,则stdin
不会被使用,因此对其进行任何更改都将无效。 / p>
答案 1 :(得分:1)
fmemopen(3)写道:
注释
没有文件描述符与返回的文件流关联 通过此函数(即,如果调用fileno(3)将返回错误 返回的流)。