Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Taking input from stdin after freopen()

Tags:

c++

c

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 first 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?

like image 675
Quixotic Avatar asked Feb 11 '11 20:02

Quixotic


2 Answers

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.)

like image 90
Fred Foo Avatar answered Nov 17 '22 15:11

Fred Foo


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.

like image 3
Jerry Coffin Avatar answered Nov 17 '22 14:11

Jerry Coffin