2.2. 从文件中读取内容

未匹配的标注

持之以恒,方得始终!

上一篇中,我们已经能把下单数据保存到文件中了,现在我们在写个脚本读取订单信息。

打开文件

$document_root = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$document_root/../orders/myorders.txt", 'rb');  // r只读模式

我们可以看下路径,放到了项目根目录之外,这样做可以加强安全性。

读文件

feof() ,告诉我们何时读完了一个文件

如果文件指针指向了文件末尾,返回true。

while(!feof($fp)) {
    // 读文件, 直到读完
}

fgets(), fgetss(), fgetcsv() 读取一行

这三个都是每次读取一行,既然是读取一行,那么想要都读完,肯定需要循环取读的。

while(!feof($fp)) {
    $order = fgets($fp, 999);
    ...
}

fgets()每次读取一行内容,直到遇到 \n,或文件结束符EOF,或者从文件中读取了999-1byte。

fgetss()fgets()差不多。不过它可以过滤字符串中包含的php,html标记。或者自定义要过滤的字符串到 allowable_tags参数中。

fgetcsv()读取一行,并且按照指定的分隔符,将这行内容,分割为一个数组。

while(!feof){
    $order = fgetcsv($fp, 100, ",");
    ...
}

长度我们按大于最长行的字符数取即可。
给个完整的读取例子

$document_root = $_SERVER['DOCUMENT_ROOT'];
@$fp = fopen("$document_root/../myorders.txt", 'rb');

if(!$fp) {
echo "<p>没有订单</p>";
exit;
}

while(!feof($fp)) {
// $order = fgets($fp, 999);
$order = fgetcsv($fp, 999, ",");
// echo $order . "<br>";
print_r($order);
}
fclose($fp);

readfile()

readfile("$document_root/../order/myorder.txt");

使用这个函数,我们可以不用fopen(),fclose()了,调用它,将打开这个文件,并输出内容,然后关闭。
它的第二个可选参数 include_path,设置一个目录,文件在此目录下。不用再给文件路径了。
它的第三个可选参数 context, 是读远程文件使用的。
它返回从文件中读出的字节总数。

这个函数看起来好像很不错,但其实不常用,因为文件数据量大时,一次性读出来,是很耗性能的,并且我们很多时候,读出的内容,并不是直接输出的。

fpassthru()

$fp = fopen("./myorders.txt", 'rb'); // 只读模式打开文件
fpassthru($fp); // 将文件内容发送到标准输出

读操作成功,fpassthru返回true,否则返回false

file()

$filearr = file("./myorders.txt");
print_r($filearr);

将整个文件读入一个数组中,每一行都是数组中的一个元素。

还有file_get_contents()函数,上一篇已经说了。具体可见手册。

fgetc() 读取一个字符

从一个文件中,一次读取一个字符

$fp = fopen("./myorders.txt", 'rb');
while(!feof($fp)) {
    $char = fgetc($fp);
    if (!feof($fp)) {
        echo $char == '\n' ? '<br>' : $char;
    }
}

fread() 读取任意长度

从文件中,读取任意长度的字节。
注意:一个英文,数字,占1个字节,一个汉字一般占3个字节。

$fp = fopen("./myorders.txt", 'rb');
$data = fread($fp, 4);
var_dump($data); // string(4) "2023"

关闭文件

同写入文件一样,读完也需要关闭 fclose()。

一个完整的例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>订单列表</title>
</head>
<body>
    <h1>Bob's Auto Parts</h1>
    <h2>Customer Orders</h2>

    <?php
    $document_root = $_SERVER['DOCUMENT_ROOT'];
    // 打开一个文件
    @$fp = fopen("$document_root/../myorders.txt", 'rb');

    if(!$fp) {
        echo "<p>没有订单</p>";
        exit;
    }

    // 每次读取一行,使用循环依次读完
    while(!feof($fp)) {
        $order = fgets($fp, 999);
        echo $order . "<br>";
    }

    // 关闭这个打开的文件资源
    fclose($fp);
    ?>
</body>
</html>

如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Junwind
讨论数量: 0
发起讨论 只看当前版本


暂无话题~