For input and output, SWI-Stream.h defines a set of 
functions that are similar to the C library functions, except prefixed 
by S, e.g. Sfprintf(). 
They differ from the C functions in following ways:
FILE, they access the Prolog streams, 
using IOSTREAM*. In particular, Scurrent_output 
accesses the current output stream and works well with
with_output_to/2. 
Similarly, there are
Scurrent_intput, Suser_output,
Suser_error, and Suser_input.stdin, stdout, stderr, you can 
use
Sinput, Soutput, Serror. These 
are not affected by predicates such as with_output_to/2.
In general, if a stream is acquired via PL_acquire_stream(), 
an error is raised when PL_release_stream() 
is called, so in that situation, there's no need to check the return 
codes from the IO functions. Blob write callbacks are also called in the 
context of an acquired stream, so there is no need to check the return 
codes from its IO function calls. However, if you use one of the 
standard streams such as
Scurrent_output, you should check the return code and 
return
FALSE from the foreign predicate, at which point an error 
will be raised. Not all IO functions follow this, because they need to 
return other information, so you should check the details with each one 
(e.g., Sputcode() 
returns -1 on error).
For more details, including formatting extensions for printing terms, see section 12.9.