What is the difference between read() and fread()?

CFileFile Io

C Problem Overview


I'm reading source code of the linux tool badblocks. They use the read() function there. Is there a difference to the standard C fread() function? (I'm not counting the arguments as a difference.)

C Solutions


Solution 1 - C

read() is a low level, unbuffered read. It makes a direct system call on UNIX.

fread() is part of the C library, and provides buffered reads. It is usually implemented by calling read() in order to fill its buffer.

Solution 2 - C

Family read() -> open, close, read, write
Family fread() -> fopen, fclose, fread, fwrite

Family read:

  • are system calls
  • are not formatted IO: we have a non formatted byte stream

Family fread

  • are functions of the standard C library (libc)
  • use an internal buffer
  • are formatted IO (with the "%.." parameter) for some of them
  • use always the Linux buffer cache

More details here, although note that this post contains some incorrect information.

Solution 3 - C

As I remember it the read() level APIs do not do buffering - so if you read() 1 byte at a time you will have a huge perf penalty compared to doing the same thing with fread(). fread() will pull a block and dole it out as you ask for it. read() will drop to the kernel for each call.

Solution 4 - C

read is a syscall, whereas fread is a function in the C standard library.

Solution 5 - C

One difference you should be aware of if you are converting code that uses one to using the other:

  • fread blocks until the number of bytes you asked for has been read, or the file ends, or an error occurs.
  • read also blocks, but if you ask for say 4kB it may return after reading just 1kB, even if the file has not ended.

This can cause subtle bugs, as it depends on where the file is stored, caches, etc.

Solution 6 - C

read() --> Directly using this system call to kernel and that performs the IO operation.

fread() --> Is a function provided in standard library.

Calling fread() is mainly used for binary file data where struct data are stored. The main difference between these two is the number of system calls in your application.

The fread() kind of standard IO library functions are optimized for system calls, rather your application making system calls.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGeorg SchöllyView Question on Stackoverflow
Solution 1 - CDarronView Answer on Stackoverflow
Solution 2 - CAIBView Answer on Stackoverflow
Solution 3 - CJoeView Answer on Stackoverflow
Solution 4 - CphihagView Answer on Stackoverflow
Solution 5 - CTor KlingbergView Answer on Stackoverflow
Solution 6 - Cchakra tView Answer on Stackoverflow