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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

HTTP

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

Webサイト

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

PHP

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

ポインタ

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

Q&A

解決済

3回答

6965閲覧

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

WeilSpinor

総合スコア170

C

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

HTTP

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

Webサイト

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

PHP

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

ポインタ

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

0グッド

0クリップ

投稿2019/03/21 06:21

編集2019/03/21 06:29

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

プログラミング初心者です。
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のアドレス値が新たに要素に追加される。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

投稿2019/03/21 07:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/21 07:31

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

退会済みユーザー

2019/03/21 07:33

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

2019/03/21 07:44

はい、詳しすぎる勉強は、目的から逸れてしまいそうなので、また今度にしたいと思います。 ただ、いまのところ、PHPでファイル操作を使いこなせるようにはなりたいので、 それができる程度の理解は得ておきたかったので…。
guest

0

ベストアンサー

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

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

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

投稿2019/03/21 07:18

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/21 07:33

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

2019/03/21 09:20

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

2019/03/21 10:15

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

0

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

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

投稿2019/03/21 06:31

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/21 07:31

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

2019/03/21 07:36

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

2019/03/21 07:41 編集

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

2019/03/21 08:47

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

2019/03/22 06:22

そうなんですね。
m.ts10806

2019/03/22 06:27 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問