fgets()和fread() - 有什么区别?

37

对于C语言而言,这似乎是此问题的最古老的重复:fgets和fread之间的区别。但是,我认为PHP答案中的一般概念同样适用。 - Gabriel Staples
5个回答

67

fgets 函数读取一行数据,它会在遇到换行符时停止。

fread 函数读取原始数据,它会在指定(或默认)的字节数后停止读取,与是否存在换行符无关。


速度不是使用其中一个函数而不是另一个函数的原因,因为这两个函数执行的操作不同:

  • 如果您想从文本文件中读取一行,则使用fgets
  • 如果您想从文件中读取一些数据(不一定是一行),则使用fread

1

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字节的内容。


0
函数fgets从文本文件中读取一行。它会一直读取,直到达到当前行的末尾(或文件的末尾)。因此,如果您想从文本文件中读取一行,应该使用fgets。 函数fread不仅可以读取到行的末尾,还可以读取到文件的末尾[e.g. fread($handle)],或者读取指定字节数[e.g. fread($handle, 1024)]。因此,如果您想读取完整的文件,无论是包含所有行的文本文件还是来自文件的任意原始数据,都应该使用fread。

0
接受的答案是正确的,但 fread 还有一种情况会停止读取。 fread 有一个 8192 字节的块限制。 当我从 fread($stream, 8300)fget($stream, 8300) 获取不同结果时,我发现了这一点。
来自 fread 文档:

如果流是读取缓冲的,并且它不代表一个普通文件,则最多只进行一次读取,该读取最多达到块大小(通常为 8192); 根据先前缓冲的数据,返回的数据大小可能大于块大小。


0

这两个函数都是用来从文件中读取数据的。

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

fread($filename, $bytes) fread会精确地读取$bytes的数据量,并且只在遇到EOF时停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接