Maison  >  Article  >  développement back-end  >  Un résumé des façons correctes d'utiliser php pour lire des fichiers, n'oubliez pas de fermer le fichier

Un résumé des façons correctes d'utiliser php pour lire des fichiers, n'oubliez pas de fermer le fichier

伊谢尔伦
伊谢尔伦original
2018-05-15 17:48:442209parcourir

La méthode fopen est probablement plus familière aux anciens programmeurs C et C++, car si vous avez utilisé ces langages, ce sont plus ou moins des outils que vous avez à votre disposition depuis des années. Pour l'une ou l'autre de ces méthodes, le fichier est ouvert par la méthode standard d'utilisation de fopen (la fonction utilisée pour lire les données), puis fermé à l'aide de fclose, comme indiqué dans le listing 1.

Listing 1. Utilisez fgets pour ouvrir et lire le fichier

$file_handle = fopen("myfile", "r"); 
while (!feof($file_handle)) { 
$line = fgets($file_handle); 
echo $line; 
} 
fclose($file_handle);

ouvrir le fichier. $file_handle stocke une référence au fichier lui-même.
Vérifiez si vous êtes arrivé à la fin du fichier.
Continuez à lire le fichier jusqu'à ce que la fin du fichier soit atteinte, en imprimant chaque ligne au fur et à mesure de sa lecture.
Fermez le fichier.
N'oubliez pas ces étapes.

feof La commande
feof détectera si vous avez atteint la fin du fichier et renverra True ou False. La boucle du listing 1 continue jusqu'à ce que vous atteigniez la fin du fichier « monfichier ». Remarque : feof renverra également False si une URL est en cours de lecture et que le socket expire car il n'y a plus de données à lire.
fclose
En passant à la fin du listing 1, fclose fait le contraire de fopen : il ferme la connexion à un fichier ou une URL. Après avoir exécuté cette fonction, vous ne pourrez plus lire aucune information du fichier ou du socket.
fgets
Reculez quelques lignes dans le listing 1 et vous arrivez au cœur de la gestion des fichiers : la lecture réelle du fichier. La fonction fgets est l'arme de choix pour le premier exemple. Il extraira une ligne de données du fichier et la renverra sous forme de chaîne. Après cela, vous pouvez imprimer ou manipuler les données. L'exemple du listing 1 imprimera correctement l'intégralité du fichier.
Si vous décidez de limiter la taille des morceaux de données en cours de traitement, vous pouvez ajouter un paramètre à fgets pour limiter la longueur maximale des lignes. Par exemple, utilisez le code suivant pour limiter la longueur de la ligne à 80 caractères : $string = fgets($file_handle, 81);
Rappelez le "

$file_handle = fopen("myfile", "r"); 
while (!feof($file_handle)) { 
echo = fgetss($file_handle); 
} 
fclose($file_handle);

以下是输出: My title
If you understand what "Cause there ain't no one for to give you no pain"
means then you listen to too much of the band America
fpassthru 函数
无论怎样读取文件,您都可以使用 fpassthru 将其余数据转储到标准输出通道。fpassthru($fh);
此外,此函数将打印数据,因此无需使用变量获取数据。
非线性文件处理:跳跃访问
当然,以上函数只允许顺序读取文件。更复杂的文件可能要求您来回跳转到文件的不同部分。这时就用得着 fseek 了。fseek($fh, 0);
以上示例将跳转回文件的开头。如果不需要完全返回 —— 我们可设定返回千字节 —— 然后就可以这样写:fseek($fh, 1024);
从 PHP V4.0 开始,您有一些其他选项。例如,如果需要从当前位置向前跳转 100 个字节,则可以尝试使用:fseek($fh, 100, SEEK_CUR);
类似地,可以使用以下代码向后跳转 100 个字节:fseek($fh, -100, SEEK_CUR);
如果需要向后跳转至文件末尾前 100 个字节处,则应使用 SEEK_END。fseek($fh, -100, SEEK_END);
在到达新位置后,可以使用 fgets、fscanf 或任何其他方法读取数据。
注:不能将 fseek 用于引用 URL 的文件处理。 

回页首
提取整个文件
现在,我们将接触到一些 PHP 的更独特的文件处理功能:用一两行处理大块数据。例如,如何提取文件并在 Web 页面上显示其全部内容?好的,您看到了 fgets 使用循环的示例。但是如何能够使此过程变得更简单?用 fgetcontents 会使过程超级简单,该方法将把整个文件放入一个字符串中。$my_file = file_get_contents("myfilename");
echo $my_file;
虽然它不是最好的做法,但是可以将此命令更简明地写为:echo file_get_contents("myfilename");
本文主要介绍的是如何处理本地文件,但是值得注意的是您还可以用这些函数提取、回显和解析其他 Web 页面。echo file_get_contents("http://127.0.0.1/");
此命令等效于:$fh = fopen("http://127.0.0.1/", "r");
fpassthru($fh);
您一定会查看此命令并认为:“那还是太费力”。PHP 开发人员同意您的看法。因此可以将以上命令缩短为:readfile("http://127.0.0.1/");
readfile 函数将把文件或 Web 页面的全部内容转储到默认的输出缓冲区。默认情况下,如果失败,此命令将打印错误消息。要避免此行为(如果需要),请尝试:@readfile("http://127.0.0.1/");
当然,如果确实需要解析文件,则 file_get_contents 返回的单个字符串可能有些让人吃不消。您的第一反应可能是用 split() 函数将它分解一下。$array = split("\n", file_get_contents("myfile"));
但是既然已经有一个很好的函数为您执行此操作为什么还要这样大费周章?PHP 的 file() 函数一步即可完成此操作:它将返回分为若干行的字符串数组。$array = file("myfile");
应当注意的是,以上两个示例有一点细微差别。虽然 split 命令将删除新行,但是当使用 file 命令(与 fgets 命令一样)时,新行仍将被附加到数组中的字符串上。
但是,PHP 的力量还远不止于此。您可以在一条命令中使用 parse_ini_file 解析整个 PHP 样式的 .ini 文件。
当然,您可能注意到此命令合并了各个部分。这是默认行为,但是您可以通过将第二个参数传递给 parse_ini_file 轻松地修正它:process_sections,这是一个布尔型变量。将 process_sections 设为 True。

$file_array = parse_ini_file("holy_grail.ini", true); 
print_r $file_array;

并且您将获得以下输出:

Array 
( 
[personal information] => Array 
( 
[name] => King Arthur 
[quest] => To seek the Holy Grail 
[favorite color] => Blue 
) 
[more stuff] => Array 
( 
[Samuel Clemens] => Mark Twain 
[Caryn Johnson] => Whoopi Goldberg 
) 
)
<?php
$file_path = "test.txt";
if(file_exists($file_path)){
 $fp = fopen($file_path,"r");
 $str = "";
 $buffer = 1024;//每次读取 1024 字节
 while(!feof($fp)){//循环读取,直至读取完整个文件
  $str .= fread($fp,$buffer);
 } 
 $str = str_replace("\r\n","<br />",$str);
 echo $str;
}
?>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn