if(fp==NULL)の代わりにif(fp=NULL)と記述することはできません。==は関係演算子で=は代入演算子となっています。
🌞 🌞 🌞
ファイルがきちんと開かれているかどうかを
確認するプログラムは
次のようなものでした。
#pragma warning(disable: 4996)
#include <stdio.h>
int main (void){
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","w");
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
fclose(fp);
return 0;
}
コンパイル結果
EAZY IDECの場合
Hello!ファイルオープンに成功しましたよ~ん
Visual Studioの場合
Hello!ファイルオープンに成功しましたよ~ん
このプログラムでは新規に
TEN-GOGO-C-language.txtファイルが作製され
そのファイルをオープンできる
(ファイルにアクセスして書き込みできる状態になっている)
ことがということが確認されています
ハードディスク内のTEN-GOGO-C-language.txtファイルに
保存されているデータを読み取れるよう
今度は
ファイルポインタ変数宣言とfopen関数の設定を
次のようにオープンモード"r"で
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","r");
おこない
TEN-GOGO-C-language.txtファイルを開くとします。
このとき
ハードディスク内に
TEN-GOGO-C-language.txtファイルが存在していなかったとします。
(ハードディスク内のTEN-GOGO-C-language.txtファイルは
コンピュータの管理画面から
TEN-GOGO-C-language.txtファイルホルダのアイコンを
右クリックして
表示されるメニューから
削除を選択、クリックすると
手動で削除することができます。)
ハードディスク内に
TEN-GOGO-C-language.txtファイルが存在していない場合
もちろん
TEN-GOGO-C-language.txtファイルを開くことはできません。
TEN-GOGO-C-language.txtファイルを開くのに失敗すると
ファイルポインタ変数宣言とfopen関数の設定
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","r");
が実行される際
fopen関数はNULLという戻り値をかえされるよう設計されており
fopen関数は
fopen("TEN-GOGO-C-language.txt","w")=NULL
であらわされるように
NULL
という値をもつことになります。
fp=fopen("TEN-GOGO-C-language.txt","w")
より
fp=fopen("TEN-GOGO-C-language.txt","w")=NULL
となり
fp=NULLより
ファイルポインタ変数fpの格納する値は
NULLとなります。
このNULLは数字の0と等しい働きをしており
ファイルポインタ変数fpは
fp=0
の値を持つことになります
先程のプログラム内の
if文の命令文
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
の
if(fp==NULL)の条件式
条件式fp==NULLは論理式であるので
fpに代入される値により
(fp==NULL)=0
もしくは
(fp==NULL)=1
の値をもつことになります。
今、fpの格納している値はNULLなので
if(fp==NULL)の中の
条件式fp==NULLは
(fp==NULL)=1
と
真の値1をもつことになります。
fp=NULL
つまり
fp=0
という値をもっていても
fp==NULLは条件式なので
(fp==NULL)=1
と
真の値1をもつことになるのがポイントですね。
つまりif文の命令文
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
は
if(1){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
となり
if()の()内の値が1ならば
if()の直ぐあとに続く命令文を実行し
if()の()内の値が0ならば
elseの直ぐあとに続く命令文を実行するという
if()文のルールにより
if()の()内の値が1なので
if(1)の直ぐあとに続く命令文
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
が実行され
コマンドプロンプト画面に
ファイルオープンに失敗しましたよ~ん
が表示されます。
ではでは
面白くなるのはここからですよ~
やってはいけませんが
次のプログラムのように
if文の
if(fp==NULL)の部分が
if(fp=NULL)と条件式が
書き換えられて
#pragma warning(disable: 4996)
#include <stdio.h>
int main (void){
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","w");
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
fclose(fp);
return 0;
}
上記のようなプログラムが実行されたなら
どのようなコンパイル結果となるのでしょうか?
fp==NULLの==は左辺と右辺を比較する関係演算子なので
論理式
(fp==NULL)は
fpのとる値により
(fp==NULL)=0
または
(fp==NULL)=1
のように
0か1の値をもつこととなります。
それに対し
if(fp=NULL)
の
fp=NULLの=は左辺に右辺の値を代入する代入演算子です。
ですので
fp=NULL
は
fpにNULLを代入することになるので
fpはつねにNULLという値をもつことになります。
NULLは0に等しい値をもつので
fpは常に0という値をもつことになります。
ですので
このままでは
if(fp=NULL)は
常に
if(0)
になり
if文
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
は
if(0){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
に等しくなり
if()の()内の値が1ならば
if()の直ぐあとに続く命令文を実行し
if()の()内の値が0ならば
elseの直ぐあとに続く命令文を実行するという
if()文のルールにより
if()の()内の値が0なので
elseの直ぐあとに続く命令文
printf("Hello!ファイルオープンに成功しましたよ~ん\n");
が常に実行されることに
なってしまいそうですね・・・
if(fp=NULL)と記述するのは正しくない記述法なのです。
それでは本当に
if(fp==NULL)の部分が
if(fp=NULL)と表記されているプログラム
#pragma warning(disable: 4996)
#include <stdio.h>
int main (void){
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","w");
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
fclose(fp);
return 0;
}
上記のプログラムが実行されたなら
コンパイル結果はどのようになるでしょうか?
if(fp=NULL)はどのように機能するのでしょうか?
ハードディスク内にTEN-GOGO-C-language.txtファイルが存在せず
ファイルオープンに失敗したなら
fopen("TEN-GOGO-C-language.txt","w")は戻り値NULL
をもつことになり
fp=NULLとなるのですが
そもそも
if文の命令文
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
の
if(fp=NULL)の条件式で
fpにNULLが代入されているので
NULLは0に等しいことにより
if(fp=NULL)は
if(0)となり
fopen("TEN-GOGO-C-language.txt","w")に戻される
戻り値の値に関わらず
elseのすぐ後につづく命令文
printf("Hello!ファイルオープンに成功しましたよ~ん\n");
が常に実行されそうですね。
実際のところ
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n")
と記述した場合
🌞1
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
🌞2
printf("Hello!ファイルオープンに成功しましたよ~ん\n");
🌞1と🌞2の
どちらの命令文が実行されるでしょうか?
実は
fp=NULLは
if文の()内で
if(fp=NULL)のように
用いられると
fp==NULLと同じく条件式の働きをするようになります。
ファイルオープンに失敗すると
fopen関数はNULLという戻り値をもち
fopen("TEN-GOGO-C-language.txt","w")=NULL
fp=fopen("TEN-GOGO-C-language.txt","w")=NULL
となり
fp=NULLとなります。
このNULLは数字の0と等しい働きをしており
ファイルポインタ変数fpは
fp=0
の値を持つことになります
このプログラムのif文
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
において
if(fp=NULL)内の
fp=NULLは
条件式
fp==NULL
と同じ働きをするので
fpがNULLという値を返されることになったなら
(fp==NULL)と記述されていたなら
(fp==NULL)=1という値を持つように
if(fp=NULL)の
(fp=NULL)は0でなく
(fp=NULL)=1
という
1の値を持つことになります
ですので
if(fp=NULL)と記述された場合
fp=NULL
つまり
fp=0と
fpに0が代入されているわけではないのですね
そのようなわけで
ファイルオープンに失敗すると
if文の条件式fp=NULLは1の値を持つので
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
は
if(0){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
でなく
if(1){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
となり
if()文のルール通り
if()の()内の値が1と真の値をもつので
if()の直ぐあとにつづく命令文
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
が実行され
コマンドプロンプト画面に
EAZY IDECの場合
ファイルオープンに失敗しましたよ~ん
が表示されます。
Visual Studioの場合
プログラムを実行しようとすると
警告文が出て
続行するかどうかを尋ねられる画面が出てくるので
いったんプログラムの実行がとまってしまいます。
ゲームプログラムで
if(fp=NULL)と記述すると
バグの原因となるかもしれません。
ではお話を改めて
TEN-GOGO-C-language.txtのファイルオープンに成功したなら
次のプログラムが実行されると
#pragma warning(disable: 4996)
#include <stdio.h>
int main (void){
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","w");
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
fclose(fp);
return 0;
}
コマンドプロンプト画面に
どのようなコンパイル結果が表示されるのでしょうか?
TEN-GOGO-C-language.txtファイルを開くのに成功すると
fp=fopen("TEN-GOGO-C-language.txt","w")
はNULL以外の数値を
戻り値にもつよう設定されています。
ですので
fopen("TEN-GOGO-C-language.txt","w")≠NULL
fp=fopen("TEN-GOGO-C-language.txt","w")≠NULL
となり
fp≠NULLとなります。
そうなると
今のプログラムの
if文
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
のif(fp==NULL)の
条件式の
fp==NULLが成立せず
条件式(fp==NULL)は偽の値0をもつことになります。
ですから
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
は
if(0){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
に等しくなり
if()文のルール通り
if()の()内の値が0という偽の値をもつので
if()の直ぐあとに続く命令文は実行されず
elseの直ぐあとに続く命令文が実行され
コマンドプロンプト画面には
EAZY IDECの場合
Hello!ファイルオープンに成功しましたよ~ん
Visual Studioの場合
Hello!ファイルオープンに成功しましたよ~ん
が表示されます。
では
ファイルオープンに成功したとき
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
と記述されていたら
実行されるのは
printf("ファイルオープンに失敗しましたよ~ん\n");
の命令文でしょうか
それとも
printf("Hello!ファイルオープンに成功しましたよ~ん\n");
でしょうか?
TEN-GOGO-C-language.txtファイルを開くのに成功すると
fopen("TEN-GOGO-C-language.txt","w")
はNULL以外の数値を
戻り値にもつよう設定されています。
ですので
fopen("TEN-GOGO-C-language.txt","w")≠NULL
fp=fopen("TEN-GOGO-C-language.txt","w")≠NULL
となり
fp≠NULLとなります。
今のプログラムの
if文
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
のif(fp=NULL)の
fp=NULLは
条件式
fp==NULL
のような働きをするので
fp≠NULL
なら
fp==NULLが成立せず
fp==NULLが偽の値0をもつように
条件式
(fp=NULL)は偽の値0をもつことになります。
ですから
if(fp=NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
は
if(0){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\n");
に等しくなり
if()文のルール通り
if()の()内の値が0なので
if()の直ぐ後につづく命令文は実行されず
else に続く命令文が実行され
コマンドプロンプト画面には
EAZY IDECの場合
Hello!ファイルオープンに成功しましたよ~ん
が表示されます。
Visual Studioの場合
プログラムを実行しようとすると
これまた
警告文が出て
続行するかどうかを尋ねられる画面が出てくるので
いったんプログラムの実行がとまってしまいます。
ゲームプログラム内で
if(fp=NULL)
が使用されると
プログラムの実行が止まってしまい
バグの原因となりそうですね。
このように
if文の条件式には
fp=NULLでなく
fp==NULLを使わなければなりません
🌞🌞🌞
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます