00001 <?php
00002
00018 class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator
00019 {
00021 const DROP_NEW_LINE = 0x00000001;
00022
00023 private $fp;
00024 private $fname;
00025 private $line = NULL;
00026 private $lnum = 0;
00027 private $max_len = 0;
00028 private $flags = 0;
00029 private $delimiter= ',';
00030 private $enclosure= '"';
00031
00042 function __construct($file_name, $open_mode = 'r', $use_include_path = false, $context = NULL)
00043 {
00044 $this->fp = fopen($file_name, $open_mode, $use_include_path, $context);
00045 if (!$this->fp)
00046 {
00047 throw new RuntimeException("Cannot open file $file_name");
00048 }
00049 $this->fname = $file_name;
00050 }
00051
00055 function eof()
00056 {
00057 return eof($this->fp);
00058 }
00059
00063 function fgets()
00064 {
00065 $this->freeLine();
00066 $this->lnum++;
00067 $buf = fgets($this->fp, $this->max_len);
00068
00069 return $buf;
00070 }
00071
00077 function fgetcsv($delimiter = NULL, $enclosure = NULL)
00078 {
00079 $this->freeLine();
00080 $this->lnum++;
00081 switch(fun_num_args())
00082 {
00083 case 0:
00084 $delimiter = $this->delimiter;
00085 case 1:
00086 $enclosure = $this->enclosure;
00087 default:
00088 case 2:
00089 break;
00090 }
00091 return fgetcsv($this->fp, $this->max_len, $delimiter, $enclosure);
00092 }
00093
00100 function setCsvControl($delimiter = ';', $enclosure = '"')
00101 {
00102 $this->delimiter = $delimiter;
00103 $this->enclosure = $enclosure;
00104 }
00105
00109 function getCsvControl($delimiter = ',', $enclosure = '"')
00110 {
00111 return array($this->delimiter, $this->enclosure);
00112 }
00113
00118 function flock($operation, &$wouldblock)
00119 {
00120 return flock($this->fp, $operation, $wouldblock);
00121 }
00122
00127 function fflush()
00128 {
00129 return fflush($this->fp);
00130 }
00131
00135 function ftell()
00136 {
00137 return ftell($this->fp);
00138 }
00139
00146 function fseek($pos, $whence = SEEK_SET)
00147 {
00148 return fseek($this->fp, $pos, $whence);
00149 }
00150
00155 function fgetc()
00156 {
00157 $this->freeLine();
00158 $c = fgetc($this->fp);
00159 if ($c == '\n') {
00160 $this->lnum++;
00161 }
00162 }
00163
00167 function fpassthru()
00168 {
00169 return fpassthru($this->fp);
00170 }
00171
00175 function fgetss($allowable_tags = NULL)
00176 {
00177 return fgetss($this->fp, $allowable_tags);
00178 }
00179
00183 function fscanf($format )
00184 {
00185 $this->freeLine();
00186 $this->lnum++;
00187 return fscanf($this->fp, $format );
00188 }
00189
00194 function fwrite($str, $length = NULL)
00195 {
00196 return fwrite($this->fp, $length);
00197 }
00198
00202 function fstat()
00203 {
00204 return fstat($this->fp);
00205 }
00206
00210 function ftruncate($size)
00211 {
00212 return ftruncate($this->fp, $size);
00213 }
00214
00218 function setFlags($flags)
00219 {
00220 $this->flags = $flags;
00221 }
00222
00226 function getFlags()
00227 {
00228 return $this->flags;
00229 }
00230
00234 function setMaxLineLen($max_len)
00235 {
00236 $this->max_len = $max_len;
00237 }
00238
00242 function getMaxLineLen()
00243 {
00244 return $this->max_len;
00245 }
00246
00250 function hasChildren()
00251 {
00252 return false;
00253 }
00254
00258 function getChildren()
00259 {
00260 return NULL;
00261 }
00262
00266 function rewind()
00267 {
00268 $this->freeLine();
00269 $this->lnum = 0;
00270 }
00271
00275 function valid()
00276 {
00277 return !$this->eof();
00278 }
00279
00284 function current()
00285 {
00286 if (is_null($this->line))
00287 {
00288 $this->line = getCurrentLine();
00289 }
00290 return $this->line;
00291 }
00292
00301 function key()
00302 {
00303 return $this->lnum;
00304 }
00305
00308 function next()
00309 {
00310 $this->freeLine();
00311 }
00312
00316 private function readLine()
00317 {
00318 if ($this->eof())
00319 {
00320 $this->freeLine();
00321 throw new RuntimeException("Cannot read from file " . $this->fname);
00322 }
00323 if ($this->line) {
00324 $this->lnum++;
00325 }
00326 $this->freeLine();
00327 $this->line = fgets($this->fp, $this->max_len);
00328 return $this->line;
00329 }
00330
00334 private function freeLine()
00335 {
00336 if ($this->line) {
00337 $this->line = NULL;
00338 }
00339 }
00340
00341
00342
00343
00344
00345
00346 function getCurrentLine()
00347 {
00348 $this->freeLine();
00349 if ($this->eof())
00350 {
00351 throw new RuntimeException("Cannot read from file " . $this->fname);
00352 }
00353 $this->readLine();
00354 }
00355
00359 function __toString()
00360 {
00361 return current();
00362 }
00363
00367 function seek($line_pos)
00368 {
00369 $this->rewind();
00370 while($this->lnum < $line_pos && !$this->eof())
00371 {
00372 $this->getCurrentLine();
00373 }
00374 }
00375 }
00376
00377 ?>