zoukankan      html  css  js  c++  java
  • 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,打完收工。

  • 相关阅读:
    网页复制内容追加到剪切板
    windows安装 rabbitmq 快速避坑
    springboot rabbitmq快速入门上手(实用)
    python3 websocket客户端
    mybatis查询结果一对多
    mysql 插入数据,存在即更新
    centos7 安装mysql8.0
    收藏一个【fastjson反序列化漏洞原理及利用】
    .NET 5 with Dapr 初体验
    HttpClient缺陷引起的 无法连接到远程服务器 通常每个套接字地址只允许使用一次
  • 原文地址:https://www.cnblogs.com/johnnyliu/p/2995527.html
Copyright © 2011-2022 走看看