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.
精彩评论