我正在阅读linux工具badblocks的源代码。他们在那里使用read()
函数。标准C fread()
函数有区别吗? (我不认为这些论点是不同的。)
答案 0 :(得分:52)
read()
是低级无缓冲读取。它在UNIX上进行直接系统调用。
fread()
是C库的一部分,并提供缓冲读取。它通常通过调用read()
来实现,以填充其缓冲区。
答案 1 :(得分:34)
家庭read()
- > open
,close
,read
,write
家庭fread()
- > fopen
,fclose
,fread
,fwrite
更多详情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库函数针对系统调用进行了优化,而不是针对应用程序进行系统调用。