老生常谈PHP 文件写入和读取(必看篇)(3)

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $fp = fopen("$DOCUMENT_ROOT/text.txt",'r');//打开文件 if(file_exists("$DOCUMENT_ROOT/text.txt")){//当文件存在时,才读取内容 while(!feof($fp)){//判断文件指针是否到达末尾 $c = fgetc($fp);//每执行一次fgetc(),文件指针就向后移动一位 echo $c;//输出获取到的字节 } } fclose($fp);//关闭文件 ?>

运行:

老生常谈PHP 文件写入和读取(必看篇)

【注意】:无论是按文本格式输入输出还是按二进制格式输出,fgetc()每次获取的是一个字节而不是一个字符

上面的例子中我们是逐个输出,现在让我们只做一次输出,看看结果怎样:

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $fp = fopen("$DOCUMENT_ROOT/text.txt",'r'); echo fgetc($fp);//只做一次输出 close($fp); ?>

运行结果如下,我们得到的不是汉字“我”,而是一个乱码,其实这个乱码就是一个字节

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $fp = fopen("$DOCUMENT_ROOT/text.txt",'r'); echo fgetc($fp);//连续做三次输出 echo fgetc($fp); echo fgetc($fp); fclose($fp); ?>

2.一次读取多个字节 ——通过fread()方法:

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $fp = fopen("$DOCUMENT_ROOT/text.txt",'r'); echo fread($fp, 3);//一次输出三个字节即一个汉字字符(UTF-8) fclose($fp); ?>

运行结果:

改成:

echo fread($fp, 6);

运行结果如下,输出了6个字节也即两个汉字字符(UTF-8)

3.一次读取一行——通过fgets()获取一行内容

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'] $fp = fopen("$DOCUMENT_ROOT/text.txt",'r');//打开文件 if(file_exists("$DOCUMENT_ROOT/text.txt")){//当文件存在时,才读取内容 while(!feof($fp)){//判断文件指针是否到达末尾 $line = fgets($fp);//返回一行文本,并将文件指针移动到下一行头部 echo $line."<br/>";//输出获取到的一行文本 } } fclose($fp);//关闭文件 ?>

老生常谈PHP 文件写入和读取(必看篇)

fgets()其实还有第二个参数,这个参数规定了每一行能读取的最大字节数(注意是字节数不是字符数):

【注意】在UTF-8编码下汉字3字节,字母1字节

下面我修改上面的一行,代码,使获取的每一行最大字符数为3(也即字节数为9)

$line = fgets($fp,10);

Demo:

【注意】:这里我fgets()里第二个参数为10,为什么是10呢?因为

1.这里的长度是按字节数算的

2.一个汉字占3个字节。fgets($fp,10)代表一次最多读取10 - 1 = 9字节

4.一次读完全部文件 ——fpassthru() or file()?

fpassthru()将读取文件并直接输出(无处理过程)

<?php $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $fp = fopen("$DOCUMENT_ROOT/text.txt",'r'); fpassthru($fp); fclose($fp); ?>

运行结果:

【注意】这里需要注意一点的是,我们并没有从fpassthru($fp)获取到返回值然后echo到页面上去,也就是说这个方法是会强制输出获取的内容的,而并不是像之前例子的方法那样返回文本,允许我们保存到变量中才将其输出

将读取到的全部内容保存到一个数组中,每个数组元素为一行的内容——fille()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a2b28a037bfd8bad39e9c4d7520b21b1.html