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

嗨,我想在调用后如何再次从stdin获取输入:

 freopen("Smefile.txt","r",stdin); 

确切地说,我希望我的第一个程序中的第一个应该从指定文件中获取下一部分将从stdin获取的输入。

喜欢:

  int a,b; freopen("Smefile.txt","r",stdin); scanf("%d",&a); { //some block here such that the next cin/scanf takes b from standard input } cin>> b; cout <<a<<" "<<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 。 完成后,使用dup2stdin的文件描述符与先前保存的文件描述符相关联,因此标准流指向它开始的位置。 有关演示代码,请参阅C片段集合中的redirect.c 。

以这种方式混合C stdio和C ++ IO流是无效的。 结果未定义。