手机版

关于PHP文件读写的老生常谈(必读)

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

文章大纲:

一、实现文件读写的基本思路

第二,使用fopen方法打开文件

三.文件读取和文件写入操作

4.使用fclose方法关闭文件

动词(verb的缩写)文档指针的移动

不及物动词输入并包装在下面。Windows和UNIX

一、实现文件读写的基本思路:

1.用fopen方法打开文件:$fp=fopen(/*参数,参数*/),fp为Resource类型2。读取或写入文件(这里使用的函数将1中返回的$fp作为参数)3。调用fclose($fp)关闭文件

二:使用fopen方法打开文件

Fopen(文件路径[字符串],打开模式[字符串])

1 1 fopen的第一个参数是写文件路径的方式:1绝对路径,2相对路径

1条绝对路径:

在窗户下工作的朋友应该很熟悉。windows下的路径分隔符是“\”而不是“/”,但是我们不能在写入路径时使用“\”作为分隔符。

如果我们用“\”分隔符写路径呢?PHP $ FP=fopen(' c : \ wamp 64 \ www \ text . txt ',' w ');操作后报告错误,表示路径参数无效

所以我们需要把分隔符“\”改成“/”:PHP $ FP=fopen(' c :/wamp 64/www/text . txt ',' w ');运行时没有报告错误,表明参数有效。

【注意】fopen函数无法理解“\”分隔符。如果要使用“\”,应该使用转义。比如写:‘c : \ \ wamp 64 \ \ www \ \ text . txt’就可以了,函数可以理解而不报错。即便如此,也不建议使用“\”,因为在OS(mac)下只能识别“/”,而不能识别“\”。

本节结论:建议坚持使用“/”作为分隔符

2.相对路径:

最后一节介绍了绝对路径的写入,但这带来了另一个问题:服务器的目录结构可能会发生很大的变化,然后所有原来的绝对路径都会被重写。比如我电脑上的目标文件路径是c:/wamp64/www/text.txt,如果把www文件夹重命名为澎湖湾呢?最初写入的路径参数无效。因此,我们引入了相对路径的编写:

?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' w ');$ _ server是PHP的超级全局变量(代码中任何地方都可以访问,类型为array),可以通过$_SERVER['DOCUMENT_ROOT']获取服务器的默认根目录

服务器的默认根目录可以通过php.ini修改(这个可以自行百度)

$ _ server ['document _ root']在这里相当于c:/wamp64/www

本节结论:推荐使用相对路径

2fopen的第二个参数是打开模式

设置打开模式后,我们为以下读写操作设置权限:

最基本的模式:

“r”:只能读取文件,但不能写入文件(写入操作被忽略)“w”:只能写入文件,但不能读取文件(读取操作被忽略)“a”:只追加文件,这与“w”类似,但区别在于“w”删除原始内容,而“a”不删除原始内容,只追加文件。

?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' w ');Fwrite($fp,'以写入模式写入');fc lose(FP美元);设置写权限后,文件可以正常写入。运行后,打开C:/WAMP 64

这次我们将权限设置为只读,并尝试写入文本:“以只读模式写入”?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');Fwrite($fp,'以读取模式写入');fc lose(FP美元);运行后打开C:/wamp64/www/text.txt,发现文件内容没有变化,说明操作被忽略,因为没有设置相应的权限

关于开放模式的网络数据,我想你最有可能找到的是这张表:(图片来自W3C)

很全面,但我觉得这款手表对新手不太友好,看了让人觉得浑浊。r为只读,W为只写(删除所有原始内容),A为追加(不删除所有原始内容),简单易懂。

但是r、w和A之间的区别和联系太模糊了。在这里,我想详细谈谈r、w和A的区别和联系。首先r、w、A可读可写,读取方式相同。关键在于写作方法的不同。 r :[覆盖]文件[头]中的原始内容([不删除]原始内容);文件[尾部]的:[附加]内容([不删除]原始内容);W :【完全删除】原内容,然后【添加】新内容。我将依次论证上述结论。首先,当我们没有写的时候,文本是“我是初始值”(意思是我是初始值)

用r模式写文字“r模式”?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');fwrite($fp,' r模式');fc lose(FP美元);跑完后打开文字,发现“我在”被“r模式”覆盖了:

以“我是初始化值”的初始文本为基础,以一种模式书写文本“a模式”。我们运行以下代码:PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' a ');fwrite($fp,' a mode ');fc lose(FP美元);

我的初始化值没有被删除和覆盖,但是这个附加了模式的新文本已经运行了很多次:

在w模式下写下文字“w模式”

我们基于“我是初始化值”的初始文本运行以下代码:PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' w ');fwrite($fp,' w模式');fc lose(FP美元);运行后,我们发现“我是初始化值”已被删除,然后添加了新的文本“w模式”

【注意】R、A、W和W的另一个区别是A和W在不存在的时候创建文件,在R文件不存在的时候报告错误。【图考】:至于R和W和a的区别,我在网上找了各种资料,包括W3C和各种博客文章,还有“PHP圣经”,发现都被拿走了。这也是我写这篇文章的原因。3.文件读取和文件写入操作首先讲几个重要的函数:file _ exists():判断文件是否存在,返回布尔值filesize () :判断文件的大小,返回文件的字节数,删除一个文件为整数unlink () :并将其写入文件fwrite(Resource file object[string],writing method [string])。资源文件对象是fopen方法返回的参数,属于资源类型,编写方法可以是W(或者W,a,r)。上面的例子已经给出了,所以不要在这里放演示。阅读文件。这是我们要阅读的文件内容:

有几种方法可以读取文件:1。一次读取一个字节的数据fgetc()。2.一次读取指定字节数的数据fread();3.一次读取一行数据fgets()/fgetcsv();4.一次读取所有数据fpassthru()/file()1();1.一次读取一个字节,并传递fgetc()。PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');//打开文件if(file _ exists($ document _ root/text . txt '){//读取内容的同时(!Feof($fp)){//判断文件指针是否到达$c=fgetc($fp)的末尾;//每次执行fgetc()时,文件指针向后移动一个echo $ c;//输出获取的字节} } fclose($ FP);//关闭文件?跑步:

【注意】:fgetc()一次取一个字节而不是一个字符,无论是以文本格式输入输出还是以二进制格式输出!在上面的例子中,我们一个一个输出,现在我们只输出一次,看看结果是什么:PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');echo fgetc(FP美元);//输出关闭($fp)仅一次;运行结果如下。我们得到的不是汉字“我”,而是乱码。事实上,这个乱码字符是一个字节

?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');echo fgetc(FP美元);//连续三次输出echo fgetc($ FP);echo fgetc(FP美元);fc lose(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(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 '){//当文件存在时,在(!Feof($fp)){//判断文件指针是否到达$line=fgets($fp)的末尾;//返回一行文本,并将文件指针移动到下一行echo $行的头部。br/';//输出获取的文本行} } fc lose($ FP);//关闭文件?

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()还是file()?Fpassthru()会读取文件并直接输出(不处理)?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');FP assthru(FP美元);fc lose(FP美元);运行结果:

【注意】这里需要注意的是,我们并没有从fpassthru($fp)中获取返回值并回显到页面,也就是说,这个方法会强制输出获取的内容,而不是像前面例子中的方法一样返回文本。在将所有读取的内容保存到数组中之前,我们可以将输出保存到一个变量中,每个数组元素是一行内容——fille()?PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ file _ array=file(' $ DOCUMENT _ ROOT/TExT . txt ');//获取文件数组foreach($ file _ arrayas $ value){//输出数组元素echo $value。br/';}?

【注意】:这里不需要写fopen和fclose!也就是说,file()方法已经为我们完成了这一步。4.用fclose方法关闭文件会返回一个布尔值,成功关闭为真,关闭失败为假(失败很少,所以不要考虑)。打开文件后要关闭它吗?1即使不手动编写fclose,在PHP脚本执行后也会自动关闭文件。2.在长时间执行的脚本中,如果不写fclose()来关闭文件,当文件被锁定时,操作将被阻止。因此,写fclose是一个好习惯。5.文件指针的移动我们上面调用的读取文件的函数实际上是基于要打印的文件指针。每次读取一个字节时,文件指针都会向后移动。PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];函数print _ file _ pointer($ FP){//定义打印文件指针位置的函数echo' br///此时文件指针的位置:';echo ftell($fp)。br/';} $ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');echo fgetc(FP美元);//通过fgetc连续输出三字节echo fgetc($ FP);echo fgetc(FP美元);print _ file _ pointer($ FP);//打印此时文件指针的位置echo fread($fp,6);//6字节的print_file_pointer($fp)通过fread输出一次;//打印文件指针此时的位置echo fgets($ FP);//通过fgets输出一整行print _ file _ pointer($ FP);//打印文件指针在fpassthru时刻的位置($ FP);//一次打印所有内容的print _ file _ pointer($ FP);//打印此时文件指针的位置fseek($fp,33);//将文件指针移动到33字节位置print _ file _ pointer($ FP);//打印此时文件指针的位置倒带($ FP);//将文件指针移动到0字节位置(初始位置)print _ file _ pointer($ FP);//打印文件指针在$fclose($fp)时刻的位置;demo :

因此,我们需要正确理解fgets()和fpassthru()的功能:fgets():不一定输出从当前文件指针位置到所有内容末尾的一整行fpassthru():数据,但不一定输出所有数据。但是这里你可能会有一个问题:为什么输出“湖湾”后指针位置是这样的?“我叫彭”这五个汉字占了3*5=15字节,这是理所当然的。额外的17-15=2字节是多少?额外的两个字节是windows下的回车换行\n\r\n是换行,占用一个字节,\r是回车,占用一个字节。我来介绍6。六中Windows和UNIX下的回车换行。PHP $ DOCUMENT _ ROOT=$ _ SERVER[' DOCUMENT _ ROOT '];$ FP=fopen(' $ DOCUMENT _ ROOT/TExT . txt ',' r ');while(!feof($ FP)){ echo fgets($ FP);echo ftell(FP美元);} fc lose($ FP);当我们在windows下按回车键时,它相当于键入\n\r,所以“我的名字是澎湖湾”的15字节“\n\r”中的2字节=17字节

mac下不同的是,按回车键相当于只输入\n,所以“我叫澎湖湾”的15字节“\n”中的1字节=16字节

以上关于编写和阅读PHP文件的老生常谈(必看文章)是边肖与大家分享的全部内容,希望能给大家一个参考和支持。

版权声明:关于PHP文件读写的老生常谈(必读)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐