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

时间:2011-02-11 20:50:27

标签: c++ c

您好我想如何在调用后再次从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;

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

你做不到。使用

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技巧,但这甚至比较狡猾。)

答案 1 :(得分:3)

它很丑陋而且(有点)非便携式。您使用fileno检索与stdin关联的文件描述符,并使用dup保留其副本。然后你做freopen。完成后,使用dup2stdin的文件描述符与之前保存的文件描述符关联起来,以便标准流指向它开始的位置。有关演示代码,请参阅C代码段集合中的redirect.c

答案 2 :(得分:0)

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