逐行读取文件中返回的字符串

时间:2011-09-30 00:04:00

标签: php file-io

我想通过逐行读取文件返回的函数传递给函数。但它的givin是一个不寻常的错误。看起来好像返回的字符串不完全是.txt文件中的行(源文件)。但是如果我手动将字符串传递给函数通过复制粘贴它work.heres ma代码: -

 <?php
 function check($string)  {  //  for removing certain text from the file
 $x  =  0;
 $delete  =  array();
 $delete[0]  =  "*";
 $delete[1]  =  "/";
 for($i=0;$i<2;$i++){
  $count=substr_count($string,$delete[$i]);
if($count>0){   
$x++;
return false;
break;
}
}
 if($x==0)return true;
 }
 $file = fopen("classlist.txt", "r") or die("Unable to open file!");
 $myFile = "new.txt";
 $fh = fopen($myFile, "w") or die("can't open file");
 while(!feof($file)){
 if(check(fgets($file))){
 $stringData = fgets($file);
 fwrite($fh, $stringData);
 }
 }
 fclose($fh);
 ?>

我得到的ma new.txt文件是:第2行第4行第6行第8行----------第21行 Plz帮帮我.....

3 个答案:

答案 0 :(得分:2)

fgets()的每次调用都会从文件中检索一个新行。每次循环迭代称它为一次,将返回的行放在一个变量中,然后检查并使用该变量。

答案 1 :(得分:2)

while循环应该看起来像这样:

while(!feof($file)){
   $stringData = fgets($file);
   if(check($stringData)){
      fwrite($fh, $stringData);
   }
}

因为你要两次调用fgets,所以你要检查奇数行并写出偶数行。

答案 2 :(得分:0)

您可以重写代码,以便减少可能发生错误的位置,SplFileObject可以方便地使用文本文件并遍历每一行。

FilterIterator只能用于返回不包含*/的行。

示例:

<?php

$inFile = "classlist.txt";
$myFile = "new.txt";

$outFile = new SplFileObject($myFile, 'w');

class LineFilter extends FilterIterator
{
    public function accept()
    {
        $line = $this->getInnerIterator()->current();
        return strlen($line) === strcspn($line, '*/');
    }
}

$filteredLines = new LineFilter(new SplFileObject($inFile));

foreach($filteredLines as $line)
{
    $outFile->fwrite($line);
}

?>