[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