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-1
byte。
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