上海龙凤419

php说话

PHP文件写入和读取教程

时辰:2024-08-06 05:24:56 php说话 我要投稿
  • 相干保举

PHP文件写入和读取教程

  PHP若何读取文件PHP读取文件能够读取以后办事器或长途办事器中的文件.以下是小编为大师搜刮清算的PHP文件写入和读取教程,但愿能给大师带来赞助!更多出色内容请实时存眷咱们应届毕业生测验网!

  文章大纲:

  一.完成文件读取和写入的根基思绪

  二.利用fopen体例翻开文件

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

  四.利用fclose体例封闭文件

  五.文件指针的挪动

  六.Windows和UNIX下的回车和换行

  一.完成文件读取和写入的根基思绪:

  1.经由进程fopen体例翻开文件:$fp =fopen(/*参数,参数*/),fp为Resource范例

  2.停止文件读取或文件写入操纵(这里利用的函数以1中前往的$fp作为参数)

  3. 挪用fclose($fp)封闭封闭文件

  二:利用fopen体例翻开文件

  fopen(文件途径[string],翻开形式[string])

  <1>fopen的第一个参数为文件途径

  写文件途径的体例:1绝对途径,2绝对途径

  1绝对途径:

  在windows下任务的小火伴们应当很熟习,windows下的途径分开符是“\”而不是“/”,但咱们在写入途径时不能以钦定的“\”为分开符

  那若是咱们以“\”分开符写入途径会若何呢?

  ?

1
2
3
 
$fp = fopen("C:\wamp64\www\text.txt",'w');
?>

  运转后报错,提醒途径参数有用

  以是咱们要把分开符“\”换成“/”:

  ?

1
2
3
 
$fp = fopen("C:/wamp64/www/text.txt",'w');
?>

  运转时无报错,申明参数是有用的。

  【注重】fopen函数不能懂得“\”分开符,若是你想要利用“\”,那末要利用本义,如写成:"C:\\wamp64\\www\\text.txt"这类写法也是能够的,函数也能懂得,不会报错。但即便如许,也不保举利用“\”,由于在OS(mac)下只能辨认“/”不能辨认“\”

  本末节的论断:保举对峙利用“/”作为分开符

  2.绝对途径:

  上一末节先容的是绝对途径的写法,但如许却带来了别的一个题目:办事器的目次布局能够会有较大的转变,这时辰本来写的绝对途径就要全数重写了,比方在我的电脑上的方针文件途径是C:/wamp64/www/text.txt,若是我把www文件夹更名为penghuwan呢?本来写入的途径参数就生效了。以是咱们引入了绝对途径的写法:

  ?

1
2
3
4
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/text.txt",'w');
?>

  • $_SERVER是PHP的超等全局变量(在代码任何处所都可拜候,范例是数组),经由进程$_SERVER['DOCUMENT_ROOT']可取到办事器的默许根目次

  办事器的默许根目次可经由进程php.ini点窜(这个可自行百度)

  • $_SERVER['DOCUMENT_ROOT']在这里同等于C:/wamp64/www

  本末节的论断:保举利用绝对途径

  <2>fopen的第二个参数为翻开形式

  设置翻开形式后,咱们就相称于为接上去的读写操纵设置了权限:

  最根基的几个形式:

  “r”:只能读取文件,不能写入文件(写入操纵被疏忽)

  “w”:只能写入文件,不能读取文件(读取操纵被疏忽)

  “a”:只追加文件,与“w”近似,区分是“w”删除原本的内容,“a”不删除原有内容,只追加内容

  ?

1
2
3
4
5
6
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/text.txt",'w');
fwrite($fp,'在写形式下写入');
fclose($fp);
?>

  在设置了写操纵的权限后,就能够一般地写入文件了

  运转后翻开C:/wamp64/www/text.txt:

  此次咱们把权限设置为只读,并测验考试写入文本:'在只读形式下写入'

  ?

1
2
3
4
5
6
 
$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”

  ?

1
2
3
4
5
6
 
$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”的初始文本咱们运转以下代码:

  ?

1
2
3
4
5
6
 
$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”的初始文本咱们运转以下代码:

  ?

1
2
3
4
5
6
 
$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()获得单个字节

  ?

1
2
3
4
5
6
7
8
9
10
11
 
$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()每次获得的是一个字节而不是一个字符!

  下面的例子中咱们是逐一输入,现在让咱们只做一次输入,看看成果若何:

  ?

1
2
3
4
5
6
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/text.txt",'r');
echo fgetc($fp);//只做一次输入
close($fp);
?>

  运转成果以下,咱们获得的不是汉字“我”,而是一个乱码,实在这个乱码便是一个字节

  ?

1
2
3
4
5
6
7
8
 
$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()体例:

  ?

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

  运转成果:

  改成:

  ?

1
echo fread($fp, 6);

  运转成果以下,输入了6个字节也即两个汉字字符(UTF-8)

  3.一次读取一行——经由进程fgets()获得一行内容

  ?

1
2
3
4
5
6
7
8
9
10
11
 
$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."
"
;//输入获获得的一行文本
}
}
fclose($fp);//封闭文件
?>

  fgets()实在另有第二个参数,这个参数划定了每行能读取的最大字节数(注重是字节数不是字符数):

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

  下面我点窜下面的一行,代码,使获得的每行最大字符数为3(也即字节数为9)

  ?

1
$line = fgets($fp,10);

  Demo:

  【注重】:这里我fgets()里第二个参数为10,为甚么是10呢?由于

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

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

  4.一次读完整数文件 ——fpassthru() or file()?

  fpassthru()将读取文件并间接输入(无处理进程)

  ?

1
2
3
4
5
6
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/text.txt",'r');
fpassthru($fp);
fclose($fp);
?>

  运转成果:

  【注重】这里须要注重一点的是,咱们并不从fpassthru($fp)获获得前往值而后echo到页面上去,也便是说这个体例是会强迫输入获得的内容的,而并不是像之前例子的体例那样前往文本,许可咱们保管到变量中才将其输入

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

  ?

1
2
3
4
5
6
7
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$file_array = file("$DOCUMENT_ROOT/text.txt");//取到文件数组
foreach ($file_array as $value) {//输入数组元素
echo $value."
"
;
}
?>

  【注重】:这里咱们并不须要写fopen和fclose哦!也便是说file()体例已帮咱们做了这一步了

  四.利用fclose体例封闭文件

  fclose()将前往一个布尔值,胜利封闭为true,封闭失利为false(失利的环境很少呈现,可不斟酌)

  是不是翻开文件后必然要封闭?

  1即便不手写fclose,在PHP剧本履行竣事后,也会主动封闭文件的

  2但在一个永劫辰履行的剧本中,若是不写封闭文件的fclose(),在文件加锁的环境下会形成操纵的梗阻,以是,写fclose是个好习气

  五.文件指针的挪动

  咱们下面挪用的读取文件的函数,实在都是基于文件指针去打印的,每读取一段字节内容,文件指针就向后挪动一段字节长度,直到被读取的文件最大字节长度为止

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
function print_file_pointer($fp){//界说一个打印文件指针地位的函数
echo "
//此时文件指针的地位:"
;
echo ftell($fp)."
"
;
}
$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下的回车和换行

  ?

1
2
3
4
5
6
7
8
9
 
$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字节

【PHP文件写入和读取教程】相干文章:

php读取文件内容的体例09-14

PHP疾速读取大文件的例子10-24

PHP中读取大文件完成体例详解09-23

php利用fgetcsv读取csv文件呈现乱码09-23

php利用file-get-contents读取大文件的体例07-12

php利用fgetcsv读取csv文件呈现乱码的处理体例10-22

PHP若何利用DOM和simplexml读取xml文档07-22

PHP若何导入和导出CSV文件08-22

PHP高等教程10-20

报告java读取properties文件的体例08-13