fgets() 和 fread() - 有啥区别?

Posted

技术标签:

【中文标题】fgets() 和 fread() - 有啥区别?【英文标题】:fgets() and fread() - What is the difference?fgets() 和 fread() - 有什么区别? 【发布时间】:2011-02-14 15:35:31 【问题描述】:

我了解 fgets()fgetss() 之间的区别,但我不明白 fgets()fread(),有人可以澄清一下这个问题吗?哪个更快?谢谢!

【问题讨论】:

对于 C,这似乎是此问题的最旧副本:Difference between fgets and fread。但是,我认为 php 答案中的一般概念也同样适用。 【参考方案1】:

接受的答案是正确的,但fread 还有一种情况要停止阅读。 fread 的块限制为 8192 字节。当我从 fread($stream, 8300)fget($stream, 8300) 得到不同的结果时,我发现了这一点。

来自fread docs:

如果流被读取缓冲并且它不代表普通文件,则最多读取一次最多等于块大小(通常为 8192)的字节数;根据之前缓存的数据,返回数据的大小可能会大于块大小。

【讨论】:

【参考方案2】:

这两个函数都用于从文件中读取数据

fgets($filename, $bytes) fgets 通常读取 $bytes-1 数量的数据并在换行符或 EOF(文件结尾)处停止,以先到者为准。如果未指定字节,则默认值为 1024 字节。

fread($filename, $bytes) fread 准确读取 $bytes 数量的数据,并且仅在 EOF 处停止。

【讨论】:

【参考方案3】:

函数 fgets 从文本文件中读取一行。它读取的时间很长,直到到达当前行的末尾(或文件的末尾)。因此,如果你想从一个文本文件中读取一行,你应该使用 fgets。 函数 fread 不仅读取到行尾,而且读取到文件末尾 [例如fread($handle)] 或作为参数指定的尽可能多的字节 [e.g. fread($句柄,1024)]。因此,如果您想读取一个完整的文件,无论是包含所有行的文本文件还是文件中的任意原始数据,都应该使用 fread。

【讨论】:

【参考方案4】:

fgets 读取 一行 -- 即它将在换行处停止。

fread 读取 原始数据 -- 它将在指定的 (或默认) 个字节后停止,与可能存在或不存在的任何换行无关.

速度不是使用另一个功能的理由,因为这两个功能不做同样的事情:

如果要从文本文件中读取一行,请使用fgets 如果你想从文件中读取一些数据(不一定是一行),那么使用fread

【讨论】:

【参考方案5】:

fread() 用于二进制数据,fread 对您可以读取的字符数有限制

$source_file = fopen( $filename, "r" ) or die("Couldn't open $filename");
while (!feof($source_file)) 
    $buffer = fread($source_file, 5);  
   var_dump($buffer); //return string with length 5 chars!

数字 5 是已读取的长度字节。

【讨论】:

以上是关于fgets() 和 fread() - 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

php中readline与fread/fgets之间的区别

php中readline与fread / fgets的区别

PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()

如何使用fgets / fread读取PIPE

请问matlab中的fread(fid,19,'int');和c语言中的fread(fid,sizeof(int),19,ch)有啥区别啊

使用 fgets/fread 从 fsockopen 读取数据挂起