
以下のプログラムは、指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです。
bcc32コンパイル時に「移植性のないポインタ変換(関数 AB )」と出てしまいます。
コンパイラの引数「-w-rpt」を使った回避以外に解決方法はございますでしょうか?
よろしくお願いいたします。
#include <stdio.h>
int AB(const char *);
void main(void) {
char A[] = "ABC.txt";
int flg;
flg = AB(A);
printf("flg = %d\n", flg);
}
int AB(const char *A_pt) {
return(fopen(A_pt, "r"));
}
No.5ベストアンサー
- 回答日時:
> 手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。
同じかどうかは、環境によって違います。すくなくとも、0だと決めつけず、「NULLが0である」ことを確認できた環境だけで使うようにします。そうでないと警告通り「移植性に問題あり」です。
> 他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。
本当にそうなら、戻り値voidは何も戻さない、ということになります。
そこに書いてあったのは、NULLがvoid *型(voidのポインタ)とかではないですか?
すくなくとも、fopenはvoid型関数ではありません。
> ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか?
たとえば、そのファイルにロックがかかっていて、読み込みオープンすらできなかったら、fopenが返すのは何だと思いますか?
「読み込みモードでfopenできた⇒ファイルが存在する」は成り立ちますが、「読み込みモードでfopenが失敗した⇒ファイルが存在しない」とは一概に言えません。
すでに出ているように、fopenでファイル存在チェックはできません。
あと、このままでは、ファイルが開きっぱなしになります。オープンできる数の限界になる、とか、チェックしたファイルに実際に読み書きしようとしたらできない、とかの問題が発生することになります。
> 手持ちの入門テキストには、そのような関数は見当たりませんでした。
入門テキストでなんでも作れるようになるわけではありません。むしろ、載っていないことの方が多いはずです。
リファレンスマニュアルを読みましょう。
確認したところ確かにNULLはvoid *型でした。
すみませんでした。
fopenでファイル存在チェックはできないことが分かりましたので、別の方法を模索したいと思います。
ご回答ありがとうございました。
No.4
- 回答日時:
>手持ちのテキストには、fopenの戻り値は「NULL」とありました
いつもNULLが返る、と思っていらっしゃいますか?
>他のWebサイトには戻り値はvoid型と書いてありました
fopen()の戻り値が、ですか?
この回答への補足
>いつもNULLが返る、と思っていらっしゃいますか?
はい、いつもNULLが返ると思っていました。
fopenが失敗した時はNULLが返るとしかテキストには載っておりませんでした。
>fopen()の戻り値が、ですか?
「ANo.5」のご回答内容に「NULLはvoid *型」とご指摘されていました通り、こちらの勘違いでした。
申し訳ありません。
No.3
- 回答日時:
ポインタ変換がどうの以前にfopen()で調べようとすることが不適切です。
ファイルの存在を調べるならaccess()やstat()じゃないかな。
この回答への補足
申し訳ありません。
手持ちの入門テキストには、そのような関数は見当たりませんでした。
テキストの問題集の一つにモジュールで分割させたファイルの存在チェックを作り、それを利用するものになります。
問題の答えになるサンプルプログラムが載っておりませんでしたので、こちらに質問させていただきました。
テキストの内容から、ファイルの存在を確認できるものとしてfopenくらいしか見当たりませんでしたので、質問にはfopenを用いてプログラムを書きました。
No.2
- 回答日時:
訂正します
> > 指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです
> という仕様になっていない可能性もあります。
→ という仕様になっていません。
ファイルが存在しても0が返ることがあります。
この回答への補足
手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。
他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。
ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
fopenできる上限の変更
-
ファイル名の先頭にアンダース...
-
vba ActiveSheet.pasteを使った...
-
Cでのネットワークファイルの読...
-
SGファイルって何ですか?
-
アプリにcsvファイルを読み込ま...
-
構造体の内容をファイルに書き...
-
同じ名前のファイルを作った場...
-
BI書、FD書 とは
-
ダイアログボックスで複数フォ...
-
csvファイルを開かずに文字を検...
-
Javascript で INI の読み書き
-
読み取り専用ファイル FileStr...
-
ファイルの結合
-
かつてN88BASIC(MS-DOS)で作っ...
-
バイナリーとして.wavファイル...
-
パワーポイントの画面表示が点...
-
テキストファイルの最終行を削...
-
COBOLでの可変長定義について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
vba ActiveSheet.pasteを使った...
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
Thunderbirdでemlファイルを開...
-
テキストファイルの最終行を削...
-
ドラッグアンドドロップでファ...
-
バッチで118項目のCSVを処理し...
-
ダイアログボックスで複数フォ...
-
グローバル変数のよくない使い...
-
VBAにてEXCEL以外のファイル(テ...
-
【C#】リソースファイルの埋め...
-
分割コンパイルの#defineについて
-
CSVファイルへの保存の際、デー...
-
RPGでファイル名(もしくはレコ...
-
SGファイルって何ですか?
-
fopenできる上限の変更
-
マウスポインタの変更
-
Cでのネットワークファイルの読...
-
ASP .NETでファイル選択ダイア...
おすすめ情報