質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    24082questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • C

    4541questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Webサイト

    1281questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • HTTP

    647questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

  • ポインタ

    135questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

【PHP】ファイルポインタの意味がわからないので、教えてください。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 243

WeilSpinor

score -37

ファイルポインタの意味がわからないので、教えてください。

プログラミング初心者です。
PHPでファイル操作について勉強していたら、ファイルポインタという言葉がよく出てくるのですが、
説明なく使われているので、よくわからず、
ファイル操作のサンプルコードの意味がいまいちわからなかったりして困っています。

整理

まず、ファイル操作の原理について整理したいと思います。

想定:磁気記憶媒体に保存されたファイル『data.csv』を扱う。

ユーザーの指示:ファイル『data.csv』を追記モード(aモード)で開け

→メモリが、『data.csv』のファイルサイズ、50バイト、に相当する作業領域(領域Aとする)を確保する。
領域Aの先頭アドレスの値を114514番とすると、そこから50個先の114563番までが領域Aに相当する。
この114514番~114563番の50個のアドレス値をそれぞれ要素にもつ配列を生成し、
それをユーザーにより宣言された変数 $data に代入。

→磁気記憶媒体に保存された『data.csv』がメモリの領域Aに読み込まれる。
以下、ユーザーはポインタ変数 $data を介して領域Aに読み込まれた『data.csv』にアクセスし、
様々なファイル操作を行うことになる。

私の仮説

ファイル"ポインタ"というからには、ポインタの一種だと思われます。
この用語が使われている様々な文脈から推察するに、以下のようなものだと考えました:

ファイルポインタとは、
ファイルの内容を読み込んだり、新しく何かを書き込んだりする際に、
読み込む部分を指定したり、新たに書き始める起点を指定したりするための指定子の役割を持つ変数である。
部分の指定は、ファイルを読み込んだメモリ領域のアドレス値を使っておこなう。

上の『data.csv』の例では、ユーザーが何らかのファイル操作を命令すると、
データ全体(のアドレス値)が格納されているポインタ変数 $data の配列の中から、
操作の目的に沿ったある一つの要素を取り出し、それをファイルポインタとして、ファイルポインタ変数 $fp に格納する。

たとえば『data.csv』をfopenの追記モードで開くと、ファイルの最後尾から書き始めるために、
ポインタ変数 $dataの最後の要素である114563番が(fopenの戻り値として)取り出され、それが$fpに格納される。
そして、この状態でfwrite($fp,"こんにちは");を実行すると、
114564番から先の領域に、データ『"こんにちは"』のデータサイズ分だけ新たなメモリ領域(領域Bとする)が確保され、そこにデータ『"こんにちは"』が格納され、
ポインタ変数 $data の配列には、領域Bのアドレス値が新たに要素に追加される。

質問

このような解釈であっているでしょうか?
ご回答宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

ファイルポインタ(phpではファイルポインタリソース)は、
ファイル(やストリームやURLなど)を読み書き(入出力)するのに必要な情報をまとめたものです。

C言語や他の言語でのファイルポインタと似ているようで違うところがあり、
単純にどこかのメモリ領域のアドレスが格納されているだけではないです。
(var_dump($fp)とかかけばファイルポインタリソースとして表示してくれるとは思いますが、まぁ理解できるような情報ではないでしょう。)

読み書きしているファイル(など)が、
今どの位置を指し示していて
読めるのか書けるのか、
対象はファイルなのかストリームなのかネット上のものか、
ファイルであればどこディレクトリのなんていうファイル名なのか、
などの様々な情報を取得するキッカケである、
と認識していれば良いかと思います。

ファイル入出力においては、
こんな図で理解していれば十分かと思います。
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 16:31

    ご回答ありがとうございます。
    概念としては私の仮説と大体同じで単純なようですが、
    実際の中身となるとそこまで単純ではないんですね…。

    キャンセル

  • 2019/03/21 16:33

    実行している環境(OSとか)に依存する話なので、ニントモカントモ。
    OSやC言語やアセンブラのあたりから理解しようとすると、いい経験にはなると思いますが、時間もかかり他にも重要なことがあるので、一周回ってから(?)でも遅くない気がします。

    キャンセル

  • 2019/03/21 16:44

    はい、詳しすぎる勉強は、目的から逸れてしまいそうなので、また今度にしたいと思います。

    ただ、いまのところ、PHPでファイル操作を使いこなせるようにはなりたいので、
    それができる程度の理解は得ておきたかったので…。

    キャンセル

checkベストアンサー

+1

C言語のFILE*が由来だと思いますが
OSまたはライブラリがファイルの読み書きのためにつかう識別子をファイルポインタと呼びます。

実際のところ中身はなんなのかは環境に依存しています。
開いているファイル名と現在の読み書きしているオフセット・バッファ
などが書き込まれたメモリへのポインタかもしれませんし
それらをハッシュテーブルに格納した際のキーかもしれません

ただ、それらをfopenで受け取り、fwrite/freadで指定することで読み書きができる。
そういうものです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 16:33

    ご回答ありがとうございます。
    概念としての仕組みとしてはただの位置指定だけれども、
    中身の仕組みは複雑で、ブラックボックスなんですね…

    キャンセル

  • 2019/03/21 18:20

    ブラックボックスとしておくことで異なる環境でも同様に使えるのです。

    キャンセル

  • 2019/03/21 19:15

    なるほど、そういう考え方もあるのですね。

    キャンセル

+1

そんな難しく考えなくとも、
たんなるファイル操作用変数のアドレス、と考えておけばいいかと。

とあるファイルをオープンしたら、ソイツのアクセス用の変数群が割り当てられて、そのポインタが返される。
以降、そのポインタをもとに読み書きが行われる、という程度でいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 16:31

    ご回答ありがとうございます。

    キャンセル

  • 2019/03/21 16:36

    本気でその実装を理解したいのなら、C言語のライブラリのソースを読めばいいかと。
    GCCのライブラリであればソースも公開されてるでしょうし

    キャンセル

  • 2019/03/21 16:41 編集

    目的から逸れそうなので、また今度にしたいと思います。
    大筋の理解が正しければ(PHPでファイル操作を使いこなせる程度に)それでいいことにしようと思います。

    キャンセル

  • 2019/03/21 17:47

    質問内容はその詳しい設計や思想部分を求めてますよ。単にphp組めるようになりたいだけなら触れなくても全く問題ない部分です。

    キャンセル

  • 2019/03/22 15:22

    そうなんですね。

    キャンセル

  • 2019/03/22 15:26 編集

    昨日のやりとりはなかったことになったわけですね。非常に残念。

    キャンセル

同じタグがついた質問を見る

  • PHP

    24082questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • C

    4541questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Webサイト

    1281questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • HTTP

    647questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

  • ポインタ

    135questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。