Reading from stdin

What are the possible ways for reading user input using read() system call in Unix. How can we read from stdin byte by byte using read()?

3

2 Answers

You can do something like this to read 10 bytes:

char buffer[10]; read(STDIN_FILENO, buffer, 10); 

remember read() doesn't add '\0' to terminate to make it string (just gives raw buffer).

To read 1 byte at a time:

char ch; while(read(STDIN_FILENO, &ch, 1) > 0) { //do stuff } 

and don't forget to #include <unistd.h>, STDIN_FILENO defined as macro in this file.

There are three standard POSIX file descriptors, corresponding to the three standard streams, which presumably every process should expect to have:

Integer value Name 0 Standard input (stdin) 1 Standard output (stdout) 2 Standard error (stderr) 

So instead STDIN_FILENO you can use 0.

Edit:
In Linux System you can find this using following command:

$ sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define' /usr/include/unistd.h:#define STDIN_FILENO 0 /* Standard input. */ 

Notice the comment /* Standard input. */

2

From the man read:

#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 

Input parameters:

  • int fd file descriptor is an integer and not a file pointer. The file descriptor for stdin is 0

  • void *buf pointer to buffer to store characters read by the read function

  • size_t count maximum number of characters to read

So you can read character by character with the following code:

char buf[1]; while(read(0, buf, sizeof(buf))>0) { // read() here read from stdin charachter by character // the buf[0] contains the character got by read() .... } 
7

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like