不会写代码怎样做网站,如何在手机上建立自己的网站,php网站调试环境搭建,服务好的南京网站建设文章提纲#xff1a;一#xff0e;实现文件读取和写入的基本思路二#xff0e;使用fopen方法打开文件三#xff0e;文件读取和文件写入操作四#xff0e;使用fclose方法关闭文件五#xff0e;文件指针的移动六#xff0e;Windows和UNIX下的回车和换行一#xff0e;实现…文章提纲 一实现文件读取和写入的基本思路 二使用fopen方法打开文件 三文件读取和文件写入操作 四使用fclose方法关闭文件 五文件指针的移动 六Windows和UNIX下的回车和换行 一实现文件读取和写入的基本思路 1通过fopen方法打开文件$fp fopen(/*参数参数*/)fp为Resource类型 2进行文件读取或者文件写入操作这里使用的函数以1中返回的$fp作为参数 3. 调用fclose($fp)关闭关闭文件 二使用fopen方法打开文件 fopen(文件路径[string],打开模式[string]) 1fopen的第一个参数为文件路径 写文件路径的方式1绝对路径2相对路径 1绝对路径 在windows下工作的小伙伴们应该很熟悉windows下的路径分隔符是“\”而不是“/”但我们在写入路径时不能以钦定的“\”为分隔符 那如果我们以“\”分隔符写入路径会怎样呢 ?php$fp fopen(C:\wamp64\www\text.txt,w);
? 运行后报错提示路径参数无效 所以我们要把分隔符“\”换成“/”: ?php$fp fopen(C:/wamp64/www/text.txt,w);
? 运行时无报错说明参数是有效的。 【注意】fopen函数不能理解“\”分隔符如果你想要使用“\”那么要使用转义如写成C:\\wamp64\\www\\text.txt这种写法也是可以的函数也能理解不会报错。但即使这样也不推荐使用“\”,因为在OS(mac)下只能识别“/”不能识别“\” 本小节的结论推荐坚持使用“/”作为分隔符 2.相对路径 上一小节介绍的是绝对路径的写法但这样却带来了另外一个问题服务器的目录结构可能会有较大的改变这时原来写的绝对路径就要全部重写了比如在我的电脑上的目标文件路径是C:/wamp64/www/text.txt如果我把www文件夹改名为penghuwan呢原来写入的路径参数就失效了。所以我们引入了相对路径的写法 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,w);
? • $_SERVER是PHP的超级全局变量在代码任何地方都可访问类型是数组通过$_SERVER[DOCUMENT_ROOT]可取到服务器的默认根目录 服务器的默认根目录可通过php.ini修改这个可自行百度 • $_SERVER[DOCUMENT_ROOT]在这里等同于C:/wamp64/ww 本小节的结论推荐使用相对路径 2fopen的第二个参数为打开模式 设置打开模式后我们就相当于为接下来的读写操作设置了权限 最基本的几个模式 “r”:只能读取文件不能写入文件写入操作被忽略 “w”:只能写入文件不能读取文件读取操作被忽略 “a”:只追加文件与“w”类似区别是“w”删除原有的内容“a”不删除原有内容只追加内容 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,w);fwrite($fp,在写模式下写入);fclose($fp);
? 在设置了写操作的权限后就能正常地写入文件了 运行后打开C:/wamp64/www/text.txt 这次我们把权限设置为只读并尝试写入文本在只读模式下写入 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,r);fwrite($fp,在读模式下写入);fclose($fp);
? 运行后打开C:/wamp64/www/text.txt发现文件内容并没有改变说明由于没有设置相应的权限操作被忽略了 关于打开模式的网络资料我想大家最可能找到的是这张表(图来自W3C) 很全面但我觉得这张表对新手有些不太友好让人看后不知多云。 r是只读w是只写原来有的内容全删除a是追加(不删除原有内容)这都好理解。 但r,w和a的区别和联系讲的实在太模糊了呀。 这里我就想详细地讲一下r,w和a三者的区别和联系: 首先r,w和a都是可读可写的读取时的方式是一样的关键在于写入方式的不同: r: 从文件[头部][覆盖]原有内容 [不删除]原有内容 a:从文件[尾部][追加]内容 [不删除]原有内容 w:[完全删除]原有内容然后[再添加]新的内容 下面我依次演示上述的结论首先我们没有写入的时候文本是”I am initialized value”(意为我是初始值) • 采用r模式写入文本“r mode” ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,r);fwrite($fp,r mode);fclose($fp);
? 运行后再打开文本发现“I am in”被“r mode”覆盖了 • 采用a模式写入文本“a mode” 基于”I am initialized value”的初始文本我们运行以下代码 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,a);fwrite($fp,a mode);fclose($fp);
? I am initialized value没有被删除和覆盖而是在后面追加了a mode的这一段新文本 运行多次后 •采用w模式写入文本“w mode” 基于”I am initialized value”的初始文本我们运行以下代码 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,w);fwrite($fp,w mode);fclose($fp);
? 运行后我们发现”I am initialized value”已经被删除了然后才加上了“w mode”这段新文本 【注意】r,a,w还有一个区别是a,w在文件不存在时则创建文件r文件不存在时报错 【吐槽】关于r和w,a的区别我找了网络上包括W3C和各种博客文章以及那本“PHP圣经”上的各种资料发现都是一笔带过去的这也是我写这篇文章的原因 三文件读取和文件写入操作 先说说几个比较重要的函数 • file_exists()判断文件是否存在返回布尔值 • filesize():判断一个文件大小返回文件的字节数为整型数字 • unlink():删除一个文件 写入文件 fwrite(资源文件对象[string],写入方式[string]),资源文件对象即为fopen方法返回的参数为Resource类型写入方式可以是w(或者w,a,r) 已经有上面的例子这里就不放demo了 读取文件 这是我们要读取的文件内容 读取文件的方式有以下几种 1.一次读取一个字节的数据 fgetc() 2.一次读取指定的字节数的数据 fread() 3.一次读取一行数据 fgets()/fgetcsv() 4.一次读完全部数据 fpassthru()/ file() 1. 一次读取一个字节 —— 通过fgetc()获取单个字节 ?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);//关闭文件
? 运行 【注意】无论是按文本格式输入输出还是按二进制格式输出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-8fclose($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);//关闭文件
? 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() ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$file_array file($DOCUMENT_ROOT/text.txt);//取到文件数组foreach ($file_array as $value) {//输出数组元素echo $value.br/;}
? 【注意】这里我们并不需要写fopen和fclose哦也就是说file()方法已经帮我们做了这一步了 四使用fclose方法关闭文件 fclose()将返回一个布尔值成功关闭为true关闭失败为false(失败的情况很少出现可不考虑) 是否打开文件后一定要关闭 1即使不手写fclose在PHP脚本执行结束后也会自动关闭文件的 2但在一个长时间执行的脚本中如果不写关闭文件的fclose()在文件加锁的情况下会造成操作的阻塞所以写fclose是个好习惯 五文件指针的移动 我们上面调用的读取文件的函数其实都是基于文件指针去打印的每读取一段字节内容文件指针就向后移动一段字节长度直到被读取的文件最大字节长度为止 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];function 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);//通过fread一次输出6字节print_file_pointer($fp);//打印此刻文件指针的位置echo fgets($fp); //通过fgets输出一整行print_file_pointer($fp);//打印此刻文件指针的位置fpassthru($fp); //一次性输出全部内容print_file_pointer($fp);//打印此刻文件指针的位置fseek($fp, 33);//使文件指针移动到33字节位置print_file_pointer($fp);//打印此刻文件指针的位置rewind($fp);//使文件指针移动到0字节位置初始位置print_file_pointer($fp);//打印此刻文件指针的位置
$fclose($fp);
? Demo: 所以我们需要正确理解fgets(),fpassthru()这些函数的作用 fgets():从当前文件指针的位置到本行结束的数据而不是一定输出一整行 fpassthru():从当前文件指针的位置到全部内容结束的数据而不是一定输出所有的数据 但在这里你可能会有疑问为什么输出“湖湾”后的指针位置会是17而不是15呢按理说输出“我叫彭湖湾”这5个汉字一共占3*5 15个字节多出来的17 - 15 2字节是什么呢 多出来的两个字节是windows下的回车换行符\n\r \n是换行占一字节\r是回车占一字节在六中我将会介绍 六Windows和UNIX下的回车和换行 ?php$DOCUMENT_ROOT $_SERVER[DOCUMENT_ROOT];$fp fopen($DOCUMENT_ROOT/text.txt,r);while(!feof($fp)){echo fgets($fp);echo ftell($fp);}fclose($fp);
? 我们在windows下敲下回车键的时候相当于键入了\n\r所以“我叫彭湖湾”的15字节“\n\r”的2字节 17字节 在mac下不一样的是敲下回车键的时候相当于只键入了\n所以“我叫彭湖湾”的15字节“\n”的1字节 16字节 【完】转载于:https://www.cnblogs.com/penghuwan/p/6884932.html