プロが教えるわが家の防犯対策術!

テキストファイルの読み込みとファイルポインタについて質問です。
最近PHPを勉強し始めました。
fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。

現状以下のテキストとPHPファイルを用意しています。
PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。

fgets()は"現在のファイルポインタから次の1行を取得"
fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。
この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。

test.phpのコメントの★の部分がわからない箇所になります。
おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。
申し訳ありませんがご教授願えないでしょうか。

-----------------
new.txt
-----------------
a
b
c
d
e
-----------------

-----------------
test.php
-----------------
<?PHP

$new_file = 'new.txt';

$fpt = fopen($new_file,'r');

// ファイルオープン直後のポインタ位置
echo '現在の位置=行指定'.ftell($fpt).'<br>';
print fgets($fpt).'<br>';

// ポインタを5進める
fseek($fpt,5);
echo '現在の位置=行指定'.ftell($fpt).'<br>';// ポインタの位置確認
print fgets($fpt).'<br>';// ★ここでeを表示したい

// 現在の位置からポインタを3戻す
fseek($fpt,-3,SEEK_CUR);
echo '現在の位置=行指定'.ftell($fpt).'<br>';// ★行指定が5-3なので2に…ならないです。
print fgets($fpt).'<br>';

// ポインタを先頭へ
rewind($fpt);
echo '現在の位置=行指定'.ftell($fpt).'<br>';// ポイントが先頭にきたか確認
print fgets($fpt).'<br>';

// ポインタを最後へ
fseek($fpt,0,SEEK_END);
echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に…
print fgets($fpt).'<br>';

fclose($fpt);// ファイルを閉じる

?>
-----------------

-----------------
実行結果
-----------------
現在の位置=行指定0
a
現在の位置=行指定5

現在の位置=行指定3
b
現在の位置=行指定0
a
現在の位置=行指定18

A 回答 (3件)

RIN_LINさん、


以下でいかがでしょうか?
<?php
$lineArray=array();//読み込んだ行を入れ込む、配列生成
$n=0;//行数のカウンター
$file=fopen('new.txt','r');//読み込み対象ファイル名を、new.txtとする
flock($file,LOCK_SH);
while (!feof($file)){//行末まで、1行単位で、読み込む
$line=fgets($file);
$n++;//行数をカウント
array_push($lineArray,$line);//配列$lineArrayに、push
}
print $lineArray[1];//0,1,2・・・の1番目を表示する
flock($file,LOCK_UN);
fclose($file);
    • good
    • 0
この回答へのお礼

お返事いただきましてありがとうございます。只今仕事中です。
ソース確認させて頂きました、なんだかうまくいけそうな気がします。

帰宅しましたら早速試させて頂きます。
結果が出ましたらまた連絡させて頂きます。
取り急ぎお礼をさせて頂きました。ありがとうございます。

お礼日時:2010/01/18 00:55

1.


$lines = file($new_file);
echo $lines[1];
2.
$fpt = fopen($new_file, 'r');
fgets($fpt);
echo fgets($fpt);
...
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
2番目にお返事いただいた方のソースで解決致しましたので閉めさえて頂きます。
お二人とも行指定の方法を教えていただいてありがとうございました。

お礼日時:2010/01/18 10:43

単に改行コード分を計算に入れてないだけでは。


ftellやfseekは行を意識しませんし。
バイナリエディタでそのファイルを見てみると分かりやすいかも。
    • good
    • 0
この回答へのお礼

返事が遅くなってしまい申し訳ありませんでした。
なるほど、行を認識してくれなかったのですね一つ勉強になりました。
fseekは"バイト数移動"というようなことも書かれていたので気になっていたのですが、そういうことだったのですね。

調べた所フリーのバイナリエディタがいくつか見つかりましたので帰宅したら早速試してみます。ありがとうございました。

お礼日時:2010/01/18 00:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!