テキストファイルの読み込みとファイルポインタについて質問です。
最近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
No.2ベストアンサー
- 回答日時:
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);
お返事いただきましてありがとうございます。只今仕事中です。
ソース確認させて頂きました、なんだかうまくいけそうな気がします。
帰宅しましたら早速試させて頂きます。
結果が出ましたらまた連絡させて頂きます。
取り急ぎお礼をさせて頂きました。ありがとうございます。
No.3
- 回答日時:
1.
$lines = file($new_file);
echo $lines[1];
2.
$fpt = fopen($new_file, 'r');
fgets($fpt);
echo fgets($fpt);
...
ご回答ありがとうございました。
2番目にお返事いただいた方のソースで解決致しましたので閉めさえて頂きます。
お二人とも行指定の方法を教えていただいてありがとうございました。
No.1
- 回答日時:
単に改行コード分を計算に入れてないだけでは。
ftellやfseekは行を意識しませんし。
バイナリエディタでそのファイルを見てみると分かりやすいかも。
返事が遅くなってしまい申し訳ありませんでした。
なるほど、行を認識してくれなかったのですね一つ勉強になりました。
fseekは"バイト数移動"というようなことも書かれていたので気になっていたのですが、そういうことだったのですね。
調べた所フリーのバイナリエディタがいくつか見つかりましたので帰宅したら早速試してみます。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- Windows 10 Windowsのバッチファイルで正規表現の置換方法について… 4 2022/12/09 16:00
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルの行数取得
-
独自INIファイルの操作をしたい...
-
Smartyで吐き出されたhtmlソー...
-
日本語が文字化けしないよう読...
-
PHP 読み込んだファイルのブラ...
-
PHPでFilename cannot be empty...
-
shift-jisでfgetcsv
-
こちらはただの直列処理ですか?
-
フォントの色を変えるには?
-
form actionで二つ送信先を指定...
-
onedrive にexcelファイルをア...
-
Apacheでhttp://localhost/が表...
-
シェルスクリプトからphpファイ...
-
FTPコマンドでディレクトリごと...
-
.htaccessにphp_valueが使用できな
-
別PHPファイルに変数を渡す
-
phpの中でphpを書けないか
-
.phpと.incファイルの違いはな...
-
PHPのif文でその処理を途中で抜...
-
トランザクションが原因?DBに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
値の取り出し方について教えて...
-
2つの画像ファイルが異なるファ...
-
PHPでFilename cannot be empty...
-
ファイル名は、数字の「0」(...
-
stat failed
-
ファイルの行数取得
-
TSVファイルをCSV形式に変換したい
-
日本語のファイルが開けない
-
XMLのロードに失敗する
-
別のサーバにあるファイルの存...
-
PHP+MySQL でのcsvファイルイン...
-
日本語のデータが文字化けをし...
-
日本語が文字化けしないよう読...
-
PHPでの別のサーバーのテキスト...
-
phpメールフォームから送信・登...
-
PHP、ファイルロックの失敗で消...
-
PHP5のsimplexml_load_fileで取...
-
PHPでAPI 出力はCSVを取得する...
-
PHPでテキストファイルかどうか...
-
PHPで特定の文字列のみ抽出し、...
おすすめ情報