### 4.31 `fwrite`, `fwrite_unlocked`—write array elements

Synopsis

    #include <stdio.h>
    size_t fwrite(const void *restrict buf, size_t size,
        size_t count, FILE *restrict fp);

    #define _BSD_SOURCE
    #include <stdio.h>
    size_t fwrite_unlocked(const void *restrict buf, size_t size,
        size_t count, FILE *restrict fp);

    #include <stdio.h>
    size_t _fwrite_r(struct _reent *ptr, const void *restrict buf, size_t size,
        size_t count, FILE *restrict fp);

    #include <stdio.h>
    size_t _fwrite_unlocked_r(struct _reent *ptr, const void *restrict buf, size_t size,
        size_t count, FILE *restrict fp);

Description
`fwrite` attempts to copy, starting from the memory location buf, count elements (each of size size) into the file or stream identified by fp. `fwrite` may copy fewer elements than count if an error intervenes.

`fwrite` also advances the file position indicator (if any) for fp by the number of characters actually written.

`fwrite_unlocked` is a non-thread-safe version of `fwrite`. `fwrite_unlocked` may only safely be used within a scope protected by flockfile() (or ftrylockfile()) and funlockfile(). This function may safely be used in a multi-threaded program if and only if they are called while the invoking thread owns the (FILE *) object, as is the case after a successful call to the flockfile() or ftrylockfile() functions. If threads are disabled, then `fwrite_unlocked` is equivalent to `fwrite`.

`_fwrite_r` and `_fwrite_unlocked_r` are simply reentrant versions of the above that take an additional reentrant structure argument: ptr.

Returns
If `fwrite` succeeds in writing all the elements you specify, the result is the same as the argument count. In any event, the result is the number of complete elements that `fwrite` copied to the file.

Portability
ANSI C requires `fwrite`.

`fwrite_unlocked` is a BSD extension also provided by GNU libc.

Supporting OS subroutines required: `close`, `fstat`, `isatty`, `lseek`, `read`, `sbrk`, `write`.