以下のプログラムは、指定したファイル名の存在を確認し、存在しなければ変数「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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
SGファイルって何ですか?
-
CSVファイルへの保存の際、デー...
-
「VBScript」ADODB.Streamにお...
-
マウスポインタの変更
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
[VBScript]ファイルの入出力を...
-
VB6でのファイル作成方法
-
VBに、Cのincludeのようなもの...
-
大きいサイズのテキストファイ...
-
fopenできる上限の変更
-
同じ名前のファイルを作った場...
-
■ 移植性のないポインタ変換に...
-
プログラムで文字をBMPファイル...
-
C言語のfopenについて教えてく...
-
CSVファイル
-
Javascript で INI の読み書き
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
ファイルを記録してあるセクタ...
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
VBに、Cのincludeのようなもの...
-
fopenできる上限の変更
-
グローバル変数のよくない使い...
-
ファイルの結合
-
大きいサイズのテキストファイ...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
ハッシュの計算時間について
-
C言語のfopenについて教えてく...
-
Javascript で INI の読み書き
-
Excelマクロでの再読込み方法
おすすめ情報