ungetc() in C/C++
The ungetc() function takes a single character and shoves it back onto an input stream. It is the opposite of the getc() function, which reads a single character from an input stream. Also, ungetc() is an input function, not an output function.
Syntax:
int ungetc(int char, FILE *stream)
Parameters:
- char: specifies the int promotion of the character to be put back. The value is internally converted to an unsigned char when put back.
- stream: specifies the pointer to a FILE object that identifies an input stream.
Return Value: The function returns two kind of values.
- On success, the ungetc() function returns the character ch.
- On failure, EOF is returned without changing the stream.
Important points about the function:
- The ungetc() function pushes the byte specified by char (converted to an unsigned char) back onto the input stream pointed to by stream.
- The pushed-back bytes is returned by subsequent reads on that stream in the reverse order of their pushing.
- A successful intervening call (with the stream pointed to by stream) to a file-positioning function ( fseek(), fsetpos(), or rewind()) discards any pushed-back bytes for the stream.
- The external storage corresponding to the stream shall be unchanged.
- A successful call to ungetc() clears the end-of-file indicator for the stream.
- The value of the file-position indicator for the stream after reading or discarding all pushed-back bytes shall be the same as it was before the bytes were pushed back.
- The file-position indicator is decremented by each successful call to ungetc(), if its value was 0 before a call, its value is unspecified after the call.
Below programs illustrate the above function.
Program 1:
#include <stdio.h> int main() { FILE * f; int char ; char buffer[256]; // read a file f = fopen ( "use1.txt" , "r" ); // when no data if (f == NULL) { printf ( "Error in opening file" ); return (-1); } // read lines till end while (! feof (f)) { // get line char = getc (f); // replace ! with + if ( char == '!' ) { ungetc ( '+' , f); } // if not else { ungetc (c, f); } fgets (buffer, 255, f); fputs (buffer, stdout); } return 0; } |
Let us assume, we have a text file use1.txt, which contains the following data. This file will be used as an input for our example program, then the input and output are shown below:
Input: !c standard library !library function stdio.h-ungetc() Output: +c standard library +library function stdio.h-ungetc()
Program 2:
// C program for taking input till we // get 1 at the input #include <stdio.h> int main() { int ch; // reads characters from the stdin and show // them on stdout until encounters '1' while ((ch = getchar ()) != '1' ) putchar (ch); // ungetc() returns '1' previously // read back to stdin ungetc (ch, stdin); // getchar() attempts to read // next character from stdin // and reads character '1' returned // back to the stdin by ungetc() ch = getchar (); // putchar() displays character putchar (ch); return 0; } |
Contact Us