一例では、上書き可能なユーザーごとのカスタム設定ファイルなどが、もし無くなった場合に、標準設定の内容になっている設定ファイルを新規に自動作成すると、便利でしょう。
たとえ、このような機能を実装する気がなくても、この事例は、ファイルポインタの概念を理解するのに重要なので、下記の説明をお読みください。
この理由は、2箇所の <code> fopen </code> の命令が同じファイルを対象おそらく、読み込みに失敗した場合は、そもそも何もオープンしてないと判断なされるので、2回目なので、失敗したぶんの <code> fopen </code> での1回目の命令が上書きぶんは、カウントされるないからです。
ただし、書き込みは通常、対象ファイルの有無に関係なく成功するので(対象ファイルの無い場合には自動作成するので)、なので、書き込みの命令のさいにファイルがオープンされるので、その1回ぶんのクローズは必要になります。
なお、もし <code>FILE* fp2; </code> などと新たにファイルポインタを宣言して、そのfp2を仲介にして各種の処理をしても、fp1で操作したファイルと同じファイル名のファイルをfp2も対象にすれば、あとから実行したほうの <code> fopen </code> で読み書きのモードは上書きされます。
つまり、ファイル名が同じなら、原則的に同じファイルであるとコンパイラは判断します。
このように、あまりファイルポインタには実体は無く、あくまでポインタであり、今風にいうならリンクのようなものです。
また、1つのファイルしか開いてないので、たとえ2回以上の <code> fopen </code> をしても、 <code> fclose </code> の回数は1回だけです。
つまり、 <code> fclose </code> の必要な回数は、けっして <code> fopen </code> の回数ではないのです。
<code> fclose </code> の必要な回数は、実際に開かれたファイルの個数です。
なので、上記のコードの直後に、もし <code> fgets </code> などの読み込み命令をしても、エラーになって、読み込みできないです。
上記のコードのあとに読み込むみをしたい場合、再度 <code> fopen </code> の読み込みモードで開いてからでないと、 <code> fgets </code> などの読み込み命令は実行できないのです。
Aborted (コアダンプ)
</pre>
=== メモのあるファイルの数値の読取 ===
|