アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のプログラムは、指定したファイル名の存在を確認し、存在しなければ変数「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"));

}

A 回答 (5件)

> 手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。



同じかどうかは、環境によって違います。すくなくとも、0だと決めつけず、「NULLが0である」ことを確認できた環境だけで使うようにします。そうでないと警告通り「移植性に問題あり」です。

> 他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。

本当にそうなら、戻り値voidは何も戻さない、ということになります。
そこに書いてあったのは、NULLがvoid *型(voidのポインタ)とかではないですか?
すくなくとも、fopenはvoid型関数ではありません。

> ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか?

たとえば、そのファイルにロックがかかっていて、読み込みオープンすらできなかったら、fopenが返すのは何だと思いますか?
「読み込みモードでfopenできた⇒ファイルが存在する」は成り立ちますが、「読み込みモードでfopenが失敗した⇒ファイルが存在しない」とは一概に言えません。
すでに出ているように、fopenでファイル存在チェックはできません。

あと、このままでは、ファイルが開きっぱなしになります。オープンできる数の限界になる、とか、チェックしたファイルに実際に読み書きしようとしたらできない、とかの問題が発生することになります。

> 手持ちの入門テキストには、そのような関数は見当たりませんでした。

入門テキストでなんでも作れるようになるわけではありません。むしろ、載っていないことの方が多いはずです。
リファレンスマニュアルを読みましょう。
    • good
    • 0
この回答へのお礼

確認したところ確かにNULLはvoid *型でした。
すみませんでした。

fopenでファイル存在チェックはできないことが分かりましたので、別の方法を模索したいと思います。

ご回答ありがとうございました。

お礼日時:2011/09/01 00:05

>手持ちのテキストには、fopenの戻り値は「NULL」とありました



いつもNULLが返る、と思っていらっしゃいますか?

>他のWebサイトには戻り値はvoid型と書いてありました

fopen()の戻り値が、ですか?

この回答への補足

>いつもNULLが返る、と思っていらっしゃいますか?

はい、いつもNULLが返ると思っていました。
fopenが失敗した時はNULLが返るとしかテキストには載っておりませんでした。

>fopen()の戻り値が、ですか?

「ANo.5」のご回答内容に「NULLはvoid *型」とご指摘されていました通り、こちらの勘違いでした。
申し訳ありません。

補足日時:2011/09/01 00:10
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2011/09/01 00:10

ポインタ変換がどうの以前にfopen()で調べようとすることが不適切です。


ファイルの存在を調べるならaccess()やstat()じゃないかな。

この回答への補足

申し訳ありません。
手持ちの入門テキストには、そのような関数は見当たりませんでした。

テキストの問題集の一つにモジュールで分割させたファイルの存在チェックを作り、それを利用するものになります。
問題の答えになるサンプルプログラムが載っておりませんでしたので、こちらに質問させていただきました。

テキストの内容から、ファイルの存在を確認できるものとしてfopenくらいしか見当たりませんでしたので、質問にはfopenを用いてプログラムを書きました。

補足日時:2011/08/31 22:32
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2011/08/31 22:32

訂正します



> > 指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです
> という仕様になっていない可能性もあります。

→ という仕様になっていません。
ファイルが存在しても0が返ることがあります。

この回答への補足

手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。
他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。

ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか?

補足日時:2011/08/31 22:23
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2011/08/31 22:24

fopenの戻り値と関数ABの戻り値を比べましょう



> 指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです

という仕様になっていない可能性もあります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2011/08/31 22:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!