PHP 的 fopen()函数

打开文件操作:

resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

可以看到,函数返回的是一个资源句柄(resource handle),类似与C中的文件指针,读和写都从文件的指针处开始。

$filename是文件的路径,可以使用绝对路径和相对路径。

$mode是打开文件的模式,也就是文章的重点。

$use_include_path 规定是否搜索指定的包含路径。

$context是上下文选项。

后面两个可以不用管,主要是mode参数。mode是告诉计算机对文件的访问操作及权限设置。在操作手册中可以看到:

mode说明
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
'x+' 创建并以读写方式打开,其他的行为和 'x' 一样。

 在学C的时候,就对文件操作存在恐惧感和抵触情绪,当时觉得对数据库的操作才是王道,更何况有这么多文件的mode.....

后来看了神作《Unix编程思想》,才知道 文本 才是数据表示的精髓......废话不多说,我们用比较的方法来方便记住:

r类(表示r和r+,下同):主打(read)操作。文件若存在,指针指向文件,文件不存在则返回false

w类:主打(write)操作。文件若存在,清空文件,指针指向文件,文件不存在则创建文件。

a类:主打添加(append)操作。指针指向文件,文件不存在则创建文件。

x类谨慎写操作。与w类类似,但文件若存在则返回false

现在能清晰点了,通过例子来看看几个易混的模式:

同为读写的r+、w+、a+、x+:

 /*
  *例如存在文件article.txt,内容如下:
    'Always be thankful!. We all have so much thankful for.'
 */

 $file = fopen($_SERVER['DOCUMENT_ROOT'].'/learn/document/article.txt', 'mode')
            or exit('Unable to open file');
 
    $output = 'something new.'; 
    fwrite($file,$output);
    fclose($file);

若mode为‘rb+’,那么文件被改为:

  'Something new.kful!. We all have so much thankful for.'

若mode为‘wb+’,那么文件被改为:

  'Something new.'

若mode为‘ab+’,那么文件被改为:

  Always be thankful!We all have so much thankful for. something new.

若mode为‘xb+’,那么显示错误:

  Unable to open file  并停止脚本。

另外,还有一个c模式,可不用记住了。

操作文件还有b(二进制)和t(文本)模式,t模式可以转换一些\t \n类的标记符号,但如果要打开图片等二进制文件,或者保证code的移植性,建议指定b模式。

最后说一下换行符,这得追溯到电传打字机的历史,有兴趣的可以百度。

在原始的表示里,/n表示newline,即光标向下移动一行,左右位置不动;而/r表示return,即光标回到行首。按理说,正常的换行应该是/n/t,但在unix系统里换行用 /n 来代替,windows则用 /r/n ,而在mac中用 /r 。这样,不同的文本在不同的系统里表现也大相径庭,给代码带来不少的麻烦。

PHP为我们考虑了这个问题,通过引入一个常量PHP_EOL(PHP_End Of Line,好记吧!),就可让PHP自动在不同的平台下选择相应的换行符,大大加强了代码的可移植性。

OK,打完收工。

原文地址:https://www.cnblogs.com/johnnyliu/p/2995527.html