Wednesday 22 November 2017

linux - C fopen vs open

itemprop="text">

Is there any reason (other than
syntactic ones) that you'd want to use



FILE *fdopen(int fd, const char
*mode);



or



FILE
*fopen(const char *path, const char
*mode);


instead of



int open(const char *pathname,
int flags, mode_t
mode);



when
using C in a Linux environment?


class="post-text" itemprop="text">
class="normal">Answer



First,
there is no particularly good reason to use fdopen if
fopen is an option and open is the
other possible choice. You shouldn't have used open to open the
file in the first place if you want a FILE *. So including
fdopen in that list is incorrect and confusing because it isn't
very much like the others. I will now proceed to ignore it because the important
distinction here is between a C standard FILE * and an
OS-specific file descriptor.



There are four main
reasons to use fopen instead of
open.




  1. fopen
    provides you with buffering IO that may turn out to be a lot faster than what you're
    doing with
    open.

  2. fopen
    does line ending translation if the file is not opened in binary mode, which can be very
    helpful if your program is ever ported to a non-Unix environment (though the world
    appears to be converging on LF-only (except IETF text-based networking protocols like
    SMTP and HTTP and such)).

  3. A FILE
    *
    gives you the ability to use fscanf and other
    stdio functions.


  4. Your code may someday need to
    be ported to some other platform that only supports ANSI C and does not support the
    open
    function.



In my opinion
the line ending translation more often gets in your way than helps you, and the parsing
of fscanf is so weak that you inevitably end up tossing it out
in favor of something more useful.



And most
platforms that support C have an open
function.



That leaves the buffering question. In
places where you are mainly reading or writing a file sequentially, the buffering
support is really helpful and a big speed improvement. But it can lead to some
interesting problems in which data does not end up in the file when you expect it to be
there. You have to remember to fclose or
fflush at the appropriate
times.



If you're doing seeks (aka
fsetpos or fseek the second of which
is slightly trickier to use in a standards compliant way), the usefulness of buffering
quickly goes down.




Of course, my bias
is that I tend to work with sockets a whole lot, and there the fact that you really want
to be doing non-blocking IO (which FILE * totally fails to
support in any reasonable way) with no buffering at all and often have complex parsing
requirements really color my perceptions.



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...