• 类似于c语言读取文件进行解析


            $log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/'.date('Ym').'/'.date('d').'_error.log';
        
            //$log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/201701/19_error.log';
     
             
            if(!file_exists($log_file_name)) return;

            
            $handle = fopen($log_file_name,'rb');
             if (FALSE === $handle) {
                 exit("Failed to open stream to URL");
             }
             
    //        $stream = fread($handle, $length);//从文件当前指针位置,往后读取n个字节长度

             //重置文件指针的位置。指定指针的位置,指针位置修改后。读取文件,后面是从这个位置开始读取了
             //fseek($handle,105);

             //fgets表示每次读取文件的一行


             $error_log_array = [];
             while(  ($line = fgets($handle) )  !==false){
                 //每次读取一行
                 
                 //匹配出现[1],tp日志中用这种表示致命错误类型
                 if(preg_match("/[1]/", $line)){
                     $error_log_array[] = $line;
                 }
                 
             }
             
             fclose($handle);


    需要注意的几个点:

    1、如果是使用fwrite,注意避免将原来文件的内容清空掉了。关键是fopen的打开方式。r或者w。

    如果使用追加方式则是a标记。

    2、fopen的时候,注意判断是否成功打开文件。避免使用feof的时候进入死循环。因为这个函数,当传入进去不是指针,则这个函数永远会返回false

    feof的本意是:判断是否为文件结尾。如果是结尾,则返回true。不是结尾返回false。如果恰好传入非法的指针,那么永远不是文件结尾了,一直返回

    false。

    feof()函数,当传入进去的不是指针类型的时候,使用如下判断会出现死循环

    while(!feof($fp)){

    }


    3、fread和fgets。读取文件一行一行读取,则使用fgets。不是按照行读取,则使用fread()读取。

         要注意这一点细节:如果没有更多的内容,则返回false,也就是两种情况,如果里面的内容为空。也会返回false。当读取到文件的结尾的时候,这两个函数也是返回false(难怪我们使用feof()使得我们不会发现这个细节,因为这个函数已经帮助我们判断文件结尾了)

      

    4、使用追加方式(即a标记)打开文件,要注意,这种方式下,无法读取文件内容的,只能往里面写入文件。所以针对这个句柄进行fread()是会得到false的

    总结是,如果只是仅仅读取文件的内容,就只用读的方式打开,如果是写入新内容进去,则用a的方式打开

    现在明白,为什么要分多种模式进行区分了。以前觉得没有用。现在看来,打开的文件方式决定了,你能够针对文件做什么(添加新内容还是读取内容。)

  • 相关阅读:
    Flume spooldir 报错 MalformedInputException: Input length = 1
    Python股票量化投资-2.量化投资介绍
    Python股票量化投资-1.开发环境部署
    centos 8 安装 activemq5.15 开机自启动
    Hystrix 说明
    Centos 8 安装 tomcat8.5 开机自启动
    Centos 8 安装 JDK 1.8
    centos 8.0 安装 nginx-1.18.0 开机自启动
    Error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"
    如何复制DataRow(dataTabel中的行)
  • 原文地址:https://www.cnblogs.com/wangtao_20/p/6322946.html
Copyright © 2020-2023  润新知