read()和fread()之间有什么区别?

时间:2009-02-24 23:40:17

标签: c file file-io

我正在阅读linux工具badblocks的源代码。他们在那里使用read()函数。标准C fread()函数有区别吗? (我不认为这些论点是不同的。)

6 个答案:

答案 0 :(得分:52)

read()是低级无缓冲读取。它在UNIX上进行直接系统调用。

fread()是C库的一部分,并提供缓冲读取。它通常通过调用read()来实现,以填充其缓冲区。

答案 1 :(得分:34)

家庭read() - > openclosereadwrite
家庭fread() - > fopenfclosefreadfwrite

家庭阅读:

  • 是系统调用
  • 没有格式化IO:我们有一个非格式化的字节流

家庭恐惧

  • 是标准C库(libc)
  • 的功能
  • 使用内部缓冲区
  • 为其中一些
  • 格式化IO(带有“%..”参数)
  • 始终使用Linux缓冲区缓存

更多详情here,但请注意此帖子包含一些不正确的信息。

答案 2 :(得分:7)

read是一个系统调用,而fread是C标准库中的一个函数。

答案 3 :(得分:6)

我记得它read()级别的API不做缓冲 - 所以如果你read()一次1个字节,那么与使用{{1 }}。当你提出要求时,fread()会拉出一个区块并将其分开。 fread()将在每次调用时进入内核。

答案 4 :(得分:2)

如果要将使用其中的代码转换为使用另一个代码,则应注意一个区别:

  • fread阻塞,直到您要求的字节数已被读取,或文件结束,或发生错误。
  • read也会阻止,但如果你要求说4kB,它可能会在读取1kB之后返回,即使该文件尚未结束。

这可能会导致细微的错误,因为它取决于文件的存储位置,缓存等。

答案 5 :(得分:0)

read()->直接使用此系统调用内核并执行IO操作。

fread()->是标准库中提供的功能。

调用fread()主要用于存储结构数据的二进制文件数据。 两者之间的主要区别是应用程序中系统调用的数量。

fread()类标准IO库函数针对系统调用进行了优化,而不是针对应用程序进行系统调用。