строка возвращается при чтении файла строка за строкой - PullRequest
2 голосов
/ 30 сентября 2011

Я хочу передать строку, возвращаемую, читая файл строка за строкой в ​​функцию.Но это приводит к необычной ошибке. Кажется, что возвращаемая строка - это не совсем строка в файле .txt (исходный файл). Однако если я вручную передам строки в функцию, скопировав ее, то код работает.*

 <?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 Плз, помогите мне .....

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Цикл while должен выглядеть примерно так:

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

Поскольку вы дважды вызываете fgets, вы проверяете нечетные строки и выписываете четные строки.

2 голосов
/ 30 сентября 2011

Каждый вызов fgets() извлекает новую строку из файла.Вызовите его один раз за итерацию цикла, поместив возвращаемую строку в переменную, а затем проверьте и используйте эту переменную.

0 голосов
/ 30 сентября 2011

Вы можете переписать свой код, чтобы уменьшить количество мест, где могут возникать ошибки, SplFileObject удобен для работы с текстовыми файлами и для перехода по каждой строке.

A 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);
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...