我正在尝试插入最初从stdin
读取fscanf
函数,例如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
错误。如果有人能告诉我我做错了什么,我将不胜感激。
我不清楚你从哪里得到的想法,你应该尝试像这样替换 stdin 的文件描述符。它不能那样工作,因为fmemopen
的全部意义在于它背后没有基础文件(因此没有文件描述符(;它只是对 stdio API 的内存缓冲区的改编。
幸运的是,我认为您没有理由需要或想要重新映射文件描述符来做您想要的事情。如果您正在拦截fscanf
并使用不同的FILE*
参数重新调用vfscanf
,则不会使用stdin
,因此对它的任何更改都不会产生任何影响。
fmemopen(3( 写道:
笔记
没有与返回的文件流关联的文件描述符 通过这个函数(即 fileno(3( 如果调用,将返回一个错误 返回的流(。