• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:OpenDialog1->FileNameについて)

C++ BuilderでOpenDialog1->FileNameについて

麻野 なぎ(@AsanoNagi)の回答

回答No.2

もう少し、基本的な「型」の情報を学んだ方がいい気はしますが。 OpenDialog1->FileName は、char* ではなく、AnsiString (バージョンによっては UnicodeString)です。 もともとポインタではないので、 NULL を指すことはありません。 文字列としてないにもない場合、 OpenDialog1->FileName == "" で比較できます。 これは、char * でもいえることで、char *ptr が、「どこも指していない(= NULLを指している)」のと、「空の文字列を指している」のは別の状態です。混同しないようにしましょう。 (ちないみに、char * の場合、 ptr == "" の比較は、これも別の意味になります) > また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか? 実際にファイルをオープンしてみて、正常にオープンできるかどうか確認するのがお手軽な気はしますが。

diy_sunny
質問者

お礼

回答頂きありがとうございます。いろいろと助かります。

関連するQ&A

  • コマンドボタンをクリック時のコードから抜けたい

    C++ Builder 2009でプログラムやってます。 コマンドボタンのクリックでファイルを開くプログラミングを作っているのですが、 ”OpenDialog1->FileName”に存在しないファイルのパスが入っていた場合に、そのコマンドボタンのコードから抜けたいのですがどうしたらよいのでしょうか? if(!FileExists(OpenDialog1->FileName)){ break; } というのがビルドエラーになるのですが、方法をご教授頂きますようお願い致します。

  • AVIファイルを読み込む方法

    C++でプログラミング中の者です。 使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。 OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。 なかなかうまくいかないので、アドバイスお願いいたします。 次のは現在のプログラムです。 #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //OpenDialog1->DefaultExt = "AVI"; //OpenDialog1->FileName = "*.avi"; if(OpenDialog1->Execute()==true){ // ファイル名が選択されたときに実行する処理  Edit1->Text=OpenDialog1->FileName; //Edit1に選択したファイル名を表示 //Animate1->Active=LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit1Change(TObject *Sender) { MediaPlayer1->Open(); MediaPlayer1->Play(); } //---------------------------------- よろしくお願いします。

  • 指定された保存先パスがない場合、エラーを出したい。

    C++ Builder2009でプログラミングしてます。 現在、Edit2->Textのファイルパスの文字列が保存先として使用していて、 FILE* fp = _wfopen(Edit2->Text.c_str(), L"wb"); このように、ファイル出力時にファイルパスを指定しているのですが、例えば、”Edit2->Text”に指定された保存先ファイルパスが存在しないフォルダだった場合など、エラーとしてファイル出力処理を停止して、さらにエラーボックス表示を出すようにしたいのですが、どのようにすればよいかご教授頂きますようよろしくお願い致します。

  • VC++のプログラミングについて

    VC++(verson2003)でテンプレートはMFCのダイアログベースでアプリケーションを作成しています。以下のプログラムはあるボタンをクリックしたときに呼び出される関数でエディット(コントロール変数m_edit1)に入力されたファイル名の内容(メモ帳に記述したテキスト文)を変数textに格納するものです。このプログラム書き換えてメモ帳に 3 1 4 9 のように記述した数字をint型の一次配列に格納するようにしたいのですがどのようにすればよいでしょうか。 void CprogramDlg::OnBnClickedButton1() { CStdioFile fin; char buf[1001]; CString text,filename; m_edit1.GetWindowText(filename); if (filename == "") return; if(!fin.Open(filename, CFile::modeRead | CFile::typeBinary)) {  AfxMessageBox("読み込みファイルをオープンできません");  return; } text = ""; while (fin.ReadString(buf,1000) != NULL) { text = text + buf; } fin.Close(); }

  • C++BuilderにてEFCreateErrorが回避できません

    こんにちは。プログラミング初心者でくだらない質問だったら申し訳ないのですが、調べてもどうしても解決できなかったので質問させて下さい。お手数をおかけしますが宜しくお願い致します。 C++Builderにて単純なプログラムを作成しています。 内容はTEditコンポーネント,TButtonコンポーネント,TOpenDialogコンポーネントを設置し、TButtonのクリックイベントでOpenDialogのExcecuteメソッドを呼びます。 ExcecuteメソッドがtrueだったらOpenDialogのFileNameプロパティの値をTEditのTextにコピーし、そのText、つまりファイルのフルパスをExtractFileName関数でファイル名のみにした値をTStringList型にAddします。 そして最後に保存ボタンクリックでTStringListオブジェクトのSaveToFileメソッドで保存する、という内容なのですが、保存ボタンクリック時にEFCreateErrorが発生してしまいます。 常に発生するのであれば原因も絞れるのですが、「OpenDialogのExcecuteメソッドを呼び出した場合のみ」という条件で例外が発生してしまい、原因が分からず困っております。 つまり、手入力でTEditに入力した場合などは正しく保存できるのですが、OpenDialogにてファイルパスを選択した場合のみ発生してしまいます。 これはどのような原因が考えられますでしょうか?

  • builder c++

    参考書に載っている読み込みの例題なんですが、 void__fastcal1 TForm1:: Button1Click(TOject*sender) { OpenDialog1->Execute(); ifstream fin; fin.open(OpenDialog1->FileName.c_st5r()); if(!fin){ ShowMessage(""); exit(1); } ....... } で実行するとエラーで"未定義のシンボルOpendialog1"と出てきてうまくいきません。どうすればうまくいきますか?

  • テキストボックスのファイルパスでfp=open

    C++ Builder2009でプログラムやってます。 テキストボックスEdit2-Textにファイルパスが入っているので、 fp = fopen( Edit2->Text , "wb" ); このようにしてファイル出力を行おうとしたら次のようなエラーが出てきました。 [BCC32 Error] Unit1.cpp(384): E2034 Cannot convert 'UnicodeString' to 'const char *' [BCC32 Error] Unit1.cpp(384): E2342 Type mismatch in parameter '__path' (wanted 'const char *', got 'UnicodeString') エラー内容だと”Edit2-Text”はUnicodeString型なので、fp = fopen にはconst char *っていう型にしないといけないという意味だと思うのですが、fopenでファイルパスをテキストボックスから渡すにはどのようにしたらよいか、ご教授よろしくお願い致します。

  • fgetcの返却値 EOFについて

    C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが あり読みにくいと思います。 fgetc関数の返却値についてのお伺いします。 EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。 ここで、質問なのですが、2つの違いを判断することは可能でしょうか? 私が行った作業は あるファイル内の文字を1文字づつ読み込んで。 文字の種類ごとに指定したbufferferに格納させたいと思っています。 しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で 場合分けができない為うまくできません。 #include <stdio.h> #include <ctype.h> char buffer[100]; char *filename="TestFile"; char* main(){ static FILE *fp = NULL; char *p = buffer; int c; if ( fp == NULL ){ if ((fp = fopen( filename, "r" )) == NULL ){ fprintf(stderr,"can not open file %s\n", filename); return ( (char *)NULL ); } } c = fgetc(fp); while(1){ switch(c){ case '\n': case '\0': *p = '\0'; return( buffer); /*以下のcase EOF の時に2通り考えられる*/ case EOF:/*読み込み終了*/ *p = '\0'; return( buffer); /* case EOF:/*読み込みエラー fprintf(stderr, " OPEN _ERROR %s\n", filename); fclose(fp); fp = NULL; return ( (char *)NULL ); */ default: *p = (char)c; p++; } c = fgetc(fp); } } 以上です。 このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。 よろしくお願いします。

  • AVIファイルをロードする方法

    こんにちわ。 C++でファイルをロードするとき、LoadFromFileメソッドを使用しますよね? BitmapやTextならロードできるのですが、AVIファイルはどうやってロードすればよいのでしょうか? * 一般的なファイルをロードする例   if(OpenDialog1->Execute()){   Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } これではAVIファイルをロードしてPanelなどのコンポーネントに表示させることができないのです。  どうか、ヒントでもアドバイスでもください!!!!  よろしくお願いします。

  • エディットボックスの内容をテキストファイルに書き込み・読み込みしたい

    プログラム初心者です。 VS2005を使用してWindowsアプリケーションの実装を行っているのですが、数個あるエディットボックスの内容を1つのテキストファイルに書き込み、そして後々に読み込みを行いたいと考えています。私の場合、エディットボックスに入力するのは数値のみなので、数値の書き込み・読み込みを行いたいのですがうまくいきません。 そこで質問なんですが、数個のエディットボックスのデータを格納する方法として、それぞれに変数を用いていいのでしょうか。 ex) edit0 = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit1 = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); それとも、1つの変数を配列として用いたほうがいいのでしょうか。 ex) edit[0] = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit[1] = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); もし前者として、その場合はWriteFileで書き込む(読み込む)場合どのようにしたら良いのでしょう。WriteFileを連続で書くとなると、上書きになるのか後ろから追加されるのかイメージがついていない状態です。 わかりずらい説明で申し訳ありません。 ご教授お願いいたします。