开发者

Taking input from stdin after freopen()

Hi I want to how can we take input from stdin again after I invoke:

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

Precisely I want my first in fi开发者_JAVA技巧rst of my program should take input from a designated file the next part would take from the stdin.

Like:

 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;

Any ideas?


You can't. Use

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

// read stuff from file

fclose(input);
input = stdin;

instead.

This won't help when you're mixing C++ and C-style I/O on the same stream, which I wouldn't recommend anyway.

(If you happen to be on Linux, you can reopen /dev/stdin instead. On Linux/Unix, you can also use Jerry Coffin's dup2 trick, but that's even hairier.)


It's ugly and (sort of) non-portable. You use fileno to retrieve the file descriptor associated with stdin and use dup to keep a copy of it. Then you do your freopen. When you're done, you use dup2 to associate stdin's file descriptor with the one you previously saved, so the standard stream points back where it started. See redirect.c from the C snippets collection for demo code.


Mixing C stdio and C++ IO streams this way is not valid. The results are undefined.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜