C++ 在freopen()之后从stdin获取输入

C++ 在freopen()之后从stdin获取输入,c++,c,C++,C,您好,我想知道在调用后,如何再次从stdin获取输入: freopen("Smefile.txt","r",stdin); 确切地说,我希望我的程序的第一部分应该从指定的文件中获取输入,下一部分将从stdin中获取输入 比如: inta,b; freopen(“Smefile.txt”,“r”,stdin); scanf(“%d”和“&a”); { //这里的一些块使得下一个cin/scanf从标准输入中获取b } cin>>b; 你不能。使用 FILE *input = fopen("Sme

您好,我想知道在调用后,如何再次从
stdin
获取输入:

freopen("Smefile.txt","r",stdin);
确切地说,我希望我的程序的第一部分应该从指定的文件中获取输入,下一部分将从stdin中获取输入

比如:

inta,b;
freopen(“Smefile.txt”,“r”,stdin);
scanf(“%d”和“&a”);
{
//这里的一些块使得下一个cin/scanf从标准输入中获取b
}
cin>>b;
你不能。使用

FILE *input = fopen("Smefile.txt","r");

// read stuff from file

fclose(input);
input = stdin;
相反

<>这对在同一个流上混合C++和C风格I/O是没有帮助的,无论如何我都不推荐。
(如果你碰巧在Linux上,你可以重新打开
/dev/stdin
。在Linux/Unix上,你也可以使用Jerry Coffin的
dup2
技巧,但那更麻烦。)

它很难看而且(有点)不可移植。您可以使用
fileno
检索与
stdin
关联的文件描述符,并使用
dup
保留其副本。然后执行
freopen
。完成后,使用
dup2
stdin
的文件描述符与之前保存的文件描述符相关联,因此标准流指向其开始位置。从C代码片段集合中查看演示代码。

< P>混合C STDIO和C++ IO流,这种方式无效。结果未定义。

为什么不为您的文件使用第二个文件句柄,而不是重复使用
stdin
?对于PO想要实现的目标,可能有一些变通方法,但问题本身本身是有价值的。在对文件使用freopen()后,是否可以从stdin获取输入。我不明白这对我的目的有什么帮助?我的应用程序需要先读取整个文件,然后从标准输入中读取。如果在Windows上,则
con
设备名称也可以工作(对于stdin和stdout)。不过,我不知道怎样才能重新打开stderr。@Jeff M:这也是不可移植的,也是解决错误问题的方法。当然,如果你要提到Unix变体,还不如包括Windows版本。;)
FILE *input = fopen("Smefile.txt","r");

// read stuff from file

fclose(input);
input = stdin;