C++ Builderでプログラミングしています。
OpenDialog1->FileName = Edit1->Text;
このようなテキストボックスに書かれたファイルパスをOpenDialog1->FileNameにいれてそこがNULLだった場合は、ファイルの読み込みを中止する処理をするようなことをやりたいと思っています。
if(OpenDialog1->FileName == NULL){
Edit1->Text;のなかに何も入っていない状態でNULLかどうかのif文に来たときに、NULLではないと判定されるのですが、この書き方に問題があるのでしょうか?
また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか?
どうぞ、ご教授の程よろしくおねがい致します。
No.1ベストアンサー
- 回答日時:
>Edit1->Text;のなかに何も入っていない状態でNULLかどうかのif文に来たときに、NULLではないと判定されるのですが、この書き方に問題があるのでしょうか?
"" == NULLが真であれば、想定した動作になるハズです。
貴方のC++ Builderは""とNULLが等価であるとは判断していないのですよ。
# まぁ、当然ですが……。
NULLなら所謂ヌルポインタ(たいていは全Bitが0)ですが、""はどっかのアドレスを指しています。
そして、指している先には'\0'が入っています。
どこかのアドレスを指している以上、NULLにはなり得ません。
# 指している先が""だった場合にNULLを代入する処理を追加しないとならない…でしょうね。
# その処理が有用かどうかは…状況次第ですが。
OPENFILENAME構造体で、選択したファイル名を受け取るバッファへのポインタをNULLにしてAPIをコールして…正常に動作するかどうかは……どうなんでしょうかね?
# キャンセルされれば正常動作でしょうが、何らかのファイルを選択するとNULLポインタアクセスで「正常に吹っ飛ぶ」でしょうね。
No.4
- 回答日時:
UnicodeStringが空かどうかを確認するにはUnicodeString.IsEmptyを使用します。
if (OpenDialog1->FileName.IsEmpty()) {
//文字列が空のとき
…
}
System.UnicodeString.IsEmpty - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
ファイルが存在するかどうかを確認するにはTFile.Existsを使用します。
#include <System.IOUtils.hpp>
if (TFile::Exists(OpenDialog1->FileName))
{
//ファイルが存在するときの処理
…
}
System.IOUtils.TFile.Exists - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
TOpenDialogを使って存在するファイルを選択させるには、次のようなコードになります。
//存在しないファイルをユーザーが選択しようとしたときにエラーメッセージを生成する
OpenDialog1->Options << ofFileMustExist;
//開くボタンが押されたとき
if (OpenDialog1->Execute())
{
//存在するファイルが選択されたときの処理
…
}
TOpenDialogのOptionsプロパティにofFileMustExistを設定すると、存在しないファイルを選択できません。
上のコードではOptionsプロパティを実行時に設定していますが、設計時にオブジェクトインスペクタのプロパティページでも設定できます。
TOpenDialogのExecuteメソッドは、開くボタンが押されたときにtrueを返します。
ファイルが選択されていないときは開くボタンを押すことができないため、戻り値がtrueのときは存在するファイルが選択されていることになります。
Optionsプロパティに設定できる値はマニュアルをご覧ください。
Vcl.Dialogs.TOpenOptions - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
No.3
- 回答日時:
>> Edit1->Text;のなかに何も入っていない状態
この場合の一般的な比較対象はNULLではなく""(空文字)です。
が、C++ Builderに限って言えばOpenDialog1->FileNameはTFileName型の様なので、
後者のどちらかコンパイルが通る方を用いるのが自然かと思います。
C++ Builderのバージョンに依存する可能性があるので2つ書いています。
if(OpenDialog1->FileName == ""){
if(OpenDialog1->FileName.empty()){ // std::stringとの比較
if(OpenDialog1->FileName.IsEmpty()){ // AnsiStringとの比較
>> OpenDialog1->FileName に入っているパスが存在しない場合
この文をそのまま条件式に直すと次の様になります。
if(!FileExists(OpenDialog1->FileName)){
回答頂きありがとうございます。
if(!FileExists(OpenDialog1->FileName))
このやり方で解決しました。助かります。
No.2
- 回答日時:
もう少し、基本的な「型」の情報を学んだ方がいい気はしますが。
OpenDialog1->FileName は、char* ではなく、AnsiString (バージョンによっては UnicodeString)です。
もともとポインタではないので、 NULL を指すことはありません。
文字列としてないにもない場合、 OpenDialog1->FileName == "" で比較できます。
これは、char * でもいえることで、char *ptr が、「どこも指していない(= NULLを指している)」のと、「空の文字列を指している」のは別の状態です。混同しないようにしましょう。
(ちないみに、char * の場合、 ptr == "" の比較は、これも別の意味になります)
> また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか?
実際にファイルをオープンしてみて、正常にオープンできるかどうか確認するのがお手軽な気はしますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- その他(IT・Webサービス) vba初心者です。 質問です。 毎回ファイル名が変わるファイルを開きたいです。 open filen 1 2022/06/11 17:59
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
グローバル変数のよくない使い...
-
分割コンパイルの#defineについて
-
Excelマクロでの再読込み方法
-
CSVファイルへの保存の際、デー...
-
大きいサイズのテキストファイ...
-
FileOpen 関数で既にファイル...
-
iniファイルに追記がしたいです。
-
ファイル名の先頭にアンダース...
-
VC++の外部依存関係
-
ファイルの結合
-
ASP .NETでファイル選択ダイア...
-
ドラッグアンドドロップでファ...
-
SGファイルって何ですか?
-
HANDLE無効について
-
obj-c iOSのローカルディスク上...
-
[VBScript]ファイルの入出力を...
-
OpenDialog1->FileNameについて
-
fprintfで文字化け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
大きいサイズのテキストファイ...
-
テキストファイルの最終行を削...
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
C言語のfopenについて教えてく...
-
SGファイルって何ですか?
-
VBに、Cのincludeのようなもの...
-
ファイルの結合
-
fopenできる上限の変更
-
「VBScript」ADODB.Streamにお...
-
iniファイルに追記がしたいです。
-
XMLファイルの表示について
-
Excelマクロでの再読込み方法
-
VBAにてEXCEL以外のファイル(テ...
おすすめ情報