Stream States
Stream States
The valid states, and state transitions, for a stream are:
Each of the circles denotes a stable state. Each of the lines denotes a transition that can occur as the result of a function call that operates on the stream. Five groups of functions can cause state transitions.
Functions in the first three groups are declared in <stdio.h>
:
- The byte read functions --
fgetc
,fgets
,fread
,fscanf
,getc
,getchar
,gets
,scanf
, andungetc
- The byte write functions --
fprintf
,fputc
,fputs
,fwrite
,printf
,putc
,putchar
,puts
,vfprintf
, andvprintf
- The position functions --
fflush
,fseek
,fsetpos
, andrewind
Functions in the remaining two groups are declared in <wchar.h>
:
- The wide read functions --
fgetwc
,fgetws
,fwscanf
,getwc
,getwchar
,ungetwc
, andwscanf
, - The wide write functions --
fwprintf
,fputwc
,fputws
,putwc
,putwchar
,vfwprintf
,vwprintf
, andwprintf
For the stream s
, the call fwide
(s, 0)
is always valid and never causes a change of state. Any other call to fwide
, or to any of the five groups of functions described above, causes the state transition shown in the state diagram. If no such transition is shown, the function call is invalid.
The state diagram shows how to establish the orientation of a stream:
- The call
fwide
(s, -1)
, or to a byte read or byte write function, establishes the stream as byte-oriented. - The call
fwide
(s, 1)
, or to a wide read or wide write function, establishes the stream as wide-oriented.
The state diagram also shows that you must call one of the position functions between most write and read operations:
- You cannot call a read function if the last operation on the stream was a write.
- You cannot call a write function if the last operation on the stream was a read, unless that read operation set the end-of-file indicator.
Finally, the state diagram shows that a position operation never decreases the number of valid function calls that can follow.