SE Does Not Like Dissent
SE Does Not Like Dissent

Reputation: 1825

C fputc error handling?

Most C file writing examples for fputc use a very basic example with little or no error checking of the process.

What error-checking techniques and functions should I use in conjunction with a fputc loop to ensure that fputc has successfully written to file? And how should I use them?

The reason I ask for fputc specifically is I am working with a doubly-linked list.

Upvotes: 2

Views: 2503

Answers (2)

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215259

Checking the return value of fputc will usually not tell you anything useful, and will make your code hideous. The reason the return value of rarely meaningful is because stdio files are buffered, and a write error (usually due to exhausting disk space, but it could also be due to hardware failure which there's really no way to handle gracefully) will not be reported until the buffer is flushed. Because of this, it's also impossible to know, even when an error is reported, how much was successfully committed to disk.

As such, my view is that you should only use stdio to write files when you're willing to consider the entire "save" operation a failure if any error occurs during writing. If you take this approach, you can completely ignore the return value of all write functions. This is because the stdio FILE keeps an internal error indicator accessible as ferror(f). So just do all your writes without checking for any errors, then before you close the file, check ferror(f). If it returns a nonzero value, you know your "save" operation failed, and you can report this to the user and remove the partially-written file. Keep in mind you should be writing first to a temporary file then rename this into place, rather than writing directly over top of your old file, unless you want to risk destroying the user's old data on failure.

Upvotes: 6

user195488
user195488

Reputation:

You should check the int return value from fputc(). The following is a list:

On success, fputc() returns the value c that it wrote to stream. On failure, it returns EOF and sets errno to one of the following values:

EACCES

Another process has the file locked. 

EBADF

stream is not a valid stream opened for writing. 

EFBIG

The file is a regular file and an attempt was made to write at or

beyond the offset maximum.

EINTR

A signal interrupted the call. 

EIO

An output error occurred. 

ENOMEM

Memory could not be allocated for internal buffers. 

ENOSPC

An attempt is made to write to a full disk.

ENXIO

A device error occurred. 

EPIPE

An attempt is made to write to a closed pipe.

Upvotes: 2

Related Questions