「C言語/ファイル入出力」の版間の差分

削除された内容 追加された内容
編集の要約なし
→‎応用例: 読み込もうとしたファイルが無い場合に、同名のファイルを作成したい場合
749 行
 
== 応用例 ==
=== 読み込もうとしたファイルが無い場合に、同名のファイルを作成したい場合 ===
 
C言語では、<code> fopen </code>で書き込みモードでオープンしようとしたとき、もしファイルがなければ、自動的にファイルを作成します。
 
 
しかし、読み込みモードでは、対象のファイルが無い場合には、けっしてC言語コンパイラは作成しません。
 
 
では、どのような場合に、読み込みモードの対象ファイルが無い場合に、作成したいと思うのでしょうか。
 
一例では、上書き可能なユーザーごとの課ステム設定ファイルなどが、もし無くなった場合に、標準設定の内容になっている設定ファイルを新規に自動作成すると、便利でしょう。
 
 
たとえ、このような機能を実装する気がなくても、この事例は、ファイルポインタの概念を理解するのに重要なので、下記の説明をお読みください。
 
 
ともかく、もし読み込みモードで対象ファイルが無い場合に、同名のファイルを新規作成したい場合には、
 
Windowsなら、たとえば、次のようなコードで実装できます。
 
<source lang=c>
FILE* fp1;
{
fp1 = fopen("SettingFile.txt", "r"); // まず、読み込みモードで開く。
 
if ( (fp1 = fopen("SettingFile.txt", "r") ) == NULL) { // 読み込みが失敗(NULL)の場合のブロック
fp1 = fopen("SettingFile.txt", "w"); // 同名のファイルをそのまま fopen で開いてもいい
{
// ここに、標準設定の書き込みの処理を書く。
}
}
fclose(fp1);
}
</source>
 
ここで重要なのは、 <code> fopen </code> は2箇所あるのに、実際に開かれるファイル名は1個(例の場合ならテキストファイル "SettingFile.txt" の1個だけ)であるという事です。
 
また、 <code> fopen </code> は2箇所あるのに、いっぽうで <code> fclose </code> は1箇所だけであるという事です。
 
 
この理由は、2箇所の <code> fopen </code> の命令が同じファイルを対象にしているので、2回目の <code> fopen </code> で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> の必要な回数は、実際に開かれたファイルの個数です。
 
 
=== メモのあるファイルの数値の読取 ===
 
772 ⟶ 831行目:
;コード例 (Fedora30 で確認ずみ)
 
<source lang=c>
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
#include <string.h>
845 ⟶ 905行目:
ファイルをクローズしました。
</pre>
 
 
== 文字コード ==