CS1061 C Programming Lecture 17: Steams and Character I/O A. O’Riordan, 2004
Creating Streams Streams are an abstraction used in C for input and output operations through devices like files, keyboard, printer, screen and I/O ports. A stream is represented by a pointer to a FILE structure that contains internal info about properties. Normally data contained in these structures are not referred to directly. You can declare streams by creating a pointer to a FILE structure. There are three streams open by default when you include stdio.h, stdin, stdout, and strerr. On my computer these are declared using FILE _iob[] (in stdio.h): #define stdin(&_iob[0]) #define stdout(&_iob[1]) #define stderr(&_iob[2])
stdin, stdout, stderr stdin - standard input stream. By default stdin corresponds to the keyboard, but this can be redirected. stdout - standard output stream. By default stdout is directed to the screen, but the operating system can redirect it to a file or any other output device. stderr - standard error stream. This is an output stream specifically intendend to receive error messages. By default is directed to the standard output (like stdout), but it can be redirected to a log file or any other output device.
getchar() A very useful function for character input. Prototype: int getchar(void); int getc(FILE *stream); getchar() gets the next character from stdin. Returns the next character from the standard input (stdin). Corresponds to: getc(stdin) If the end of file is reached or there has been an error, the function returns EOF.
getchar() example /* getchar example : typewriter */ #include int main(){ char c; printf("Enter line (dot '.' in sentence to exit)"); do{ c = getchar(); putchar(c); }while (c != '.'); return 0; }
putchar() A very useful function for writing a character. Prototype: int putchar(int character); int putc(int character, FILE * stream); putchar() writes character to stdout. Writes to the current position in the standard output (stdout) and increments the file pointer to point to next character. This routine corresponds to: putc(character,stdout). The value returned is the written character. If an error occurs, EOF is returned.
putchar() example /* putchar example: printing alphabet */ #include int main(){ char c; for (c = 'A' ; c <= 'Z' ; c++){ putchar(c); } return 0; } This program writes ABCDEFGHIJKLMNOPQRSTUVWXYZ to the standard output (screen).
ungetc() Sometimes it is handy to put a character back on the stream. This gives you a read- ahead facility. int ungetc(int character, FILE *stream); A character is pushed onto an input stream and the file pointer is reset to that previous position. This character will be returned by the next call to getc(). char c; c = getc(stdio); ungetc(c, stdio); /* put it back again */
system() Prototype: int system(const char * command); Invokes command shell to execute a command. Once terminated, the interpreter gives back control to the program returning an int value. Need to include stdlib.h. If a command was successfully executed the command interpreter returns 0. A return value of -1 indicates an error. Following is a program to display a Unix directory listing.
system() example #include int main(){ int i; printf("Trying to execute ls (directory listing"); i = system("ls"); if (i == -1) printf("Error executing ls\n"); else printf("Command successfully executed\n"); return 0; }
getenv() You can also get system environment variables. Prototype: char *getenv(const char * varname); Gets string from environment - a pointer to the null-terminated string containing the value of the environment variable varname. If the requested variable is not defined in the environment the function returns a NULL pointer. Depending on system this function may or not be case sensitive.
getenv() example /* getenv example: getting path */ #include int main (){ char * buffer; buffer = getenv("PATH"); if (buffer != NULL) printf("Current path is: %s",buffer); return 0; }