从freopen()函数后的标准输入(stdin)获取输入

7

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

freopen("Smefile.txt","r",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;

有什么想法吗?

1
为什么不使用第二个文件句柄来处理文件,而要重复使用stdin? - Oliver Charlesworth
可能有一些解决方法可以实现PO想要的目标,但问题本身具有独立的价值。在使用freopen()打开文件后,是否可以从stdin获取输入? - Shamim Hafiz - MSFT
3个回答

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
我不明白这如何有助于我的目的?我的应用程序需要先读取整个文件,然后再从标准输入读取。 - Quixotic
如果在Windows上,con 设备名称也可以使用(对于标准输入和标准输出都适用)。然而,我不知道如何重新打开标准错误流。 - Jeff Mercado
@Jeff M:这也是不可移植的,并且解决了错误的问题。 - Fred Foo
当然,但如果你要提到Unix变体,也可以包括Windows变体。 ;) - Jeff Mercado

3

这种方法很丑陋并且不太可移植。使用fileno获取与stdin相关联的文件描述符,然后使用dup创建其副本。接着进行freopen操作。完成后,使用dup2stdin的文件描述符重新关联到之前保存的那个,以便标准流指向原来的位置。请参考C代码片段集合中的redirect.c示例代码。


0
混合使用C标准I/O和C++ IO流是无效的,结果是未定义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接