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

削除された内容 追加された内容
811 行
 
上記のコードのあとに読み込むをしたい場合、再度 <code> fopen </code> の読み込みモードで開いてからでないと、 <code> fgets </code> などの読み込み命令は実行できないのです。
 
 
 
 
 
Linux の場合で、ほぼ同様です。実際、次のソースコードを実行すると、わかります。
 
;コード (Fedora 31 で確認ずみ)
<source lang=c>
// Linux用
#include <stdio.h>
#include <stdlib.h> // Windowsでは「続行するには何かキーを押してください . . .」を表示するのに必要だった。
 
// #pragma warning(disable:4996) // Linux なので不要だし、あるとエラーの原因になる
 
int main()
{
FILE* fp1;
{
fp1 = fopen("SettingFile.txt", "r"); // まず、読み込みモードで開く。
 
if ( (fp1 = fopen("SettingFile.txt", "r") ) == NULL) { // 読み込みが失敗(NULL)の場合のブロック
fp1 = fopen("SettingFile.txt", "w"); // 同名のファイルをそのまま fopen で開いてもいい
printf("ファイルが存在しないので作成しています。ファイル名: SettingFile.txt \n");
fprintf(fp1, "書き込みテスト \n");
}
else {
printf("ファイルはすでに存在しています。 \n");
}
fclose(fp1);
 
printf("ファイルを閉じました。 \n");
printf("終了しています。 \n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
}
</source>
 
 
;実行例 (ファイルのない場合)
<pre>
ファイルが存在しないので作成しています。ファイル名: SettingFile.txt
ファイルを閉じました。
終了しています。
</pre>
 
 
;実行例 (ファイルのある場合)
<pre>
ファイルはすでに存在しています。
ファイルを閉じました。
終了しています。
</pre>
 
;SettingFile.txtの中身
<pre>
書き込みテスト
</pre>
 
のようになります。
 
 
* エラー例
いっぽう、もし <code>fclose(fp1);</code> を2回使っても、コンパイルは失敗してエラーになり、下記のように途中でエラーメッセージが表示されてしまい中断します。
<pre>
ファイルはすでに存在しています。
free(): double free detected in tcache 2
Aborted (コアダンプ)
</pre>
 
=== if文の条件節にファイルポインタを使った場合にはブロック内でクローズできない ===