[vox-tech] file and keyboard input stream in C
Tim Riley
vox-tech@lists.lugod.org
Tue, 04 Mar 2003 08:18:28 -0800
Peter Jay Salzman wrote:
> i have code that reads from stdin via getchar(). i'd like to use the
> program by redirecting a text file to its stdin:
>
> ./a.out < myfile.txt
>
> after it does its stuff, i'd like use stdin from a keyboard (after it
> processes the data from myfile.txt it displays the data using ncurses
> and requires input from me using the ncurses input functions).
>
The function dup() will allow you to close stdin and open it
again from the keyboard using /dev/tty.
Here is a demonstration program:
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
int main( int argc, char **argv )
{
char input_buffer[ 1024 ];
int file_descriptor;
if ( fgets( input_buffer, 1023, stdin ) )
{
printf( "got from stdin = %s\n", input_buffer );
}
close( 0 );
file_descriptor = open( "/dev/tty", O_RDONLY );
dup( file_descriptor );
if ( fgets( input_buffer, 1023, stdin ) )
{
printf( "got from stdin = %s\n", input_buffer );
}
}
Test it with:
$ echo test | a.out
After you're finished with stdin, close it with close( 0 ). (Every
program
gets three open file descriptors, 0 = stdin, 1 = stdout, 2 = stderr.)
Then open /dev/tty and assign it to stdin via the dup() function. The
dup() function copies an open file descriptor to the first available
file descriptor slot starting at zero -- in this case slot zero because
of the close( 0 ) call.
>
> unfortunately, i can't use the ncurses input functions. presumably
> because stdin is attached to a file instead of the keyboard.
>
> how can i reattach stdin back to the keyboard?
>
> pete
>
> --
> First they ignore you, then they laugh at you, then they fight you,
> then you win. -- Gandhi, being prophetic about Linux.
>
> Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D
> _______________________________________________
> vox-tech mailing list
> vox-tech@lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech