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

削除された内容 追加された内容
884 行
 
=== if文の条件節にファイルポインタを使った場合にはブロック内でクローズできない ===
==== Windowsの場合 ====
タイトルのとおり、下のようなコードがあると、エラーになります。
 
900 ⟶ 901行目:
 
ついつい、ファイルを開けなかった場合などには、「この命令は用済みだから、すぐファイルを閉じよう(×)」って発想で、むりやりブロック中でクローズしようと思いたくなります。
しかし、上記のように、if文の条件節にファイルポインタを使ったif文の中で、むりやりクローズしようとしても、実行時にエラーになります。
 
 
Linux でも同様です。
 
ただし、所属しているブロックの条件判定文で'''使ってない''' ファイルポインタおよび別ファイルなら(たとえば ファイルポインタ fp20 と 対象ファイル名"sanpuru20" とする)、それは条件節のファイルとはまったくの別物ですので、fp1のif文のブロック内でも別物のfp20と"sanpuru20"はオープンすることもクローズも可能です。
たとえば、次のコードは、読み取り対象のファイル"SettingFile.txt"の無い場合には、エラーになります
 
 
==== Linuxの場合 ====
ファイルのオープンに失敗した場合、そもそもそのファイルはオープンされてないのでクローズの必要もないです。
 
また、もしもオープンに失敗したファイルをクローズしようとした場合、実行時にエラーになります。
 
コンパイルできてしまうかもしれませんが、しかしビルドされた実行ファイルの実行時にエラーになり、「コアダンプ」などのメッセージが表示されます。
 
 
たとえば、次のコードは、読み取り対象のファイル"SettingFile.txt"の無い場合には、実行時にエラーになります
<source lang=c>
// Linuxでエラーになる例
939 ⟶ 950行目:
 
 
いっぽう、次のように改善すれば、エラーにならず、コンパイル実行できます。
 
(Fedora 31 で確認ずみ)
961 ⟶ 972行目:
else {
printf("ファイルを開けました。 \n");
fclose(fp1); // elseが実行される場合、このブロックの始めではファイルがオープン状態なので、すぐ閉じたいなら、ここで。
printf("ファイルを閉じました。 \n");
}
975 ⟶ 986行目:
 
 
上のコード
// ここではない
の場所で<code> fclose(fp1);</code> でクローズすると、ファイルの存在しない場合にエラーになります。なぜなら、オープンしてないファイルをクローズしようとしているからです。そのような動作は、エラーになり、認められません。
 
 
ただし、所属しているブロックの条件判定文で'''使ってない''' ファイルポインタおよび別ファイルなら(たとえば ファイルポインタ fp20 と 対象ファイル名"sanpuru20" とする)、それは条件節のファイルとはまったくの別物ですので、fp1のif文のブロック内でも別物のfp20と"sanpuru20"はオープンすることもクローズも可能です。
同様に、elseブロック内でクローズした場合でも、さらに「ここではない」の場所でもう一度クローズしてしまうと、これもエラーになります。
 
=== メモのあるファイルの数値の読取 ===