ファイル(ディスク上のものも仮想のものも)はメモリに読み込む必要があります。
そのメモリ上の場所を示すのがファイルポインタ(orハンドル)で、多くの言語ではファイルのオープン時に変数として割り当てられます。「この"text.txt"ってファイルを開いてよ」という依頼に対し、「じゃぁ、このfpっていう変数が指している場所に読み込んでやるよ」と教えてくれるわけです。
多くの場合、読み書きが終わるとファイルを読み込むためのメモリ領域が不要になりますし、(ディスクなど)アクセス競合の管理があるメディアの場合は「もう使わないよ」と宣言してもらう必要があったり、必要がないにしても、並行に実行されている他の処理がスムーズに進む場合があります。プログラム内でクローズするとそのようなことが(必要なら)行われます。
URLはダミーです。
http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
あえて、質問者の最初の問題提起にそって述べます。
・ファイル読み取りは、【ディスク内のデータ領域のある特定のアドレスの】これらの1,0の並びを認識すること
・ファイル書き込みは、【ディスク内のデータ領域のある特定のアドレスの】これらの並びを変更すること
ですが、では、そのアドレスはどうやってディスク装置が知ることができるか、です。なにしろ、ユーザはファイル名しか与えていないからです。
で、ディスク内には、ディレクトリ領域というのがあって、そこに「ファイル名とアドレスの対応表を格納することができます。まだ対応ができていない(新規書き込み)なら対応表を作ります。すでにあるときには、その対応表を読みます」。これは物理的には、ディレクトリ情報(ファイル名、アドレス、書き込み権利など)が、0,1で構成される文字情報、数字情報なので、それらの0,1情報を読んだり書いたりしています。つまりディスク本体では、オープンやクローズでは、ディレクトリ領域に対する読み書きが発生しています。
で、ディレクトリ領域がどこにあるかというと、それはいわゆるOSが知っているわけですが、そのOSというのも、ほとんどの場合Disk OSなので、ディスク内のOS領域に対して読み書きしています。
もちろん、オープン、クローズは主記憶内でもいろいろなことをやっていますが、ディスクへの物理的なアクセスは発生しています(それを仮想ディスクであるメモリ空間であるとか、細かくいえばありますが、おおざっぱな認識として)。
ダミー:http://q.hatena.ne.jp/answer
●追記: ついでにいうと、「ファイル削除」は、決して、「データ領域のビットを全て0で埋め尽くす」ということでなく、ディレクトリ領域の対応表を消すことです。したがって、実際のディスクのアドレスは、別のファイルによって再利用されるかもしれないし、再利用されないで、元のデータが残っているかもしれない、です。
既に色々な方の回答もありますので、ちょっと違う観点からの回答とします。
自分もC言語を勉強し始めの頃は、同じような疑問を持ちました。
自分の経験を踏まえて考えますと、コンピュータを勉強し始めの頃は、
シンプルなモデル上で、プログラムをイメージしていたように思います。
メモリ上には、自分のプログラムだけが配置され、入出力機能も独占しているような状態。
であれば、やりたい事が、ディスクへの書き込みであれば、
何故に、直接、ディスクへ書き込んでくれないの?といった感じです。
初期のコンピュータでは、きっと、直接書き込んでいたように思います。
でも、みなさんが説明して頂いているように、低レベルでの読み書きは、
実は、色々と面倒な手順を踏まないといけないんですね。
「こんなの毎回やってられね?よ。
ファイル名指定するだけで、後は書き込みたいデータだけ渡せば、
(もしくは読み込みたい領域を指定すれば)
面倒な事は代わりに誰かやってくれ?!!」
そんなこんなでOSが登場するわけです。
現在のOSは、色々と芸達者で、規模も大きくなっていますが、
ここでの説明では、便利なサブルーチンの集合とでも捉えて下さい。
で、まぁ、ディスク読み書き用のサブルーチンを用意してもらったので、
今までの面倒な作業をする代わりに、
読み書きする前にサブルーチン(f)openを呼び出すと、
OSは読み書きに必要な物をあれこれと用意してくれます。
ファイルポインタやファイルハンドルといった物は、
その必要な物のあれやこれやを参照する為の物です。
その後、(f)readや(f)writeなどで、好きに読み書きを依頼すれば、
OSが責任を持って面倒な作業を肩代わりしてくれます。
また、OSは、調停役であり監視役でもありますので、
他のプログラムとの兼ね合いやら権限のチェックやら、
もしくはシステム全体の効率なども踏まえて、
適切と思われるタイミングで物理的な読み書きを実行します。
そのような理由もあって、依頼した内容が、即反映されるとは限りませんが、
基本的にはOSが帳尻を合わせてくれます。(電源ぶち切りとかしなければ)
で、最後に、読み書きが終了した時点で、(f)closeを呼び出すと、
OSは、あれこれと用意した物を、綺麗に片付けます。
これを忘れると、OSは、まだ読み書きを続けるつもりで、
あれこれと必要な物を残したままにしておきます。
昔、新米プログラマの時、closeを忘れ、
メモリ不足でアプリが落ちた苦い経験がありますが、
きっと、多分、そのような経験を重ねる事で、
コンピュータの内部の動きが実感出来るような気もしますので、
たくさん書いて、たくさん動かしてみる、というのも大事かな、なんて思います。
http://d.hatena.ne.jp/rascal_k2/