【发布时间】:2019-02-26 10:12:53
【问题描述】:
我正在尝试插入最初从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 错误。如果有人能告诉我我做错了什么,我将不胜感激。
【问题讨论】:
-
fileno(in)产生什么价值?这实际上是一个打开的文件描述符吗?目前尚不清楚您从哪里获得 EBADF。在您测试fmemopen()是否成功后,您不会显示错误检测代码。不要忘记关闭您打开的内容。我的怀疑是你试图尝试一些不受支持的东西。基于字符串的文件流应该有一个与之关联的有效打开文件描述符,也没有明显的理由可以将该文件描述符复制到dup2()。我从来没有想过尝试;我认为实现是不同的。 -
@JonathanLeffler:很明显:
fileno(in)返回 -1,因为内存缓冲区FILE没有关联的文件描述符。 -
@R.. - 它没有显示在检测到 EBADF 的问题中。代码中没有提到
errno。
标签: c input io shared-libraries file-descriptor