■ テキストファイルを、リッチテキストに開き、変更後保存する
以下のプログラムです @テキストファイルを開き、リッチテキストに表示する。 Aリッチテキストの内容を変更する Bファイルを保存する。 備考: コンポーネントとしては、OpenFileDailogueとSaveFileDialogueをフォームにセットします。 |
|
Form.h 抜粋 <プログラム例> #pragma once namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // this->Text = "ファイル開く・保存"; } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //ファイルを開く { // OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); // ダイアログのタイトルを設定する openFileDialog1->Title = "ダイアログのタイトルをココに書く"; // 初期表示するディレクトリを設定するgc openFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する openFileDialog1->FileName = "初期表示するファイル名をココに書く"; // ファイルのフィルタを設定する openFileDialog1->Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) openFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // [読み取り専用] チェックボックスをオンにする (初期値 false) openFileDialog1->ReadOnlyChecked = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { // StreamReader の新しいインスタンスを生成する System::IO::StreamReader^ cReader = ( gcnew System::IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::Default) ); // ファイルの最後まで読み込む String^ stBuffer = cReader->ReadToEnd(); // cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照) cReader->Close(); richTextBox1->Text = stBuffer; String^ str = openFileDialog1->FileName; //ダイアログのタイトルをフルパスのファイル名に変更 this -> Text = str; // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete openFileDialog1; // 左記コードはコンパイラNG:openFileDialog1->Dispose(); } } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Clear(); //画面クリア } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) //ファイルを保存する { // SaveFileDialog の新しいインスタンスを生成するい) SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog(); // ダイアログのタイトルを設定する saveFileDialog1->Title = "ここにダイアログのタイトルを書いてください"; // 初期表示するディレクトリを設定する saveFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する saveFileDialog1->FileName = "ファイル名(.txt)"; // ファイルのフィルタを設定する saveFileDialog1->Filter = "テキスト ファイル(.txt)|*.txt"; //saveFileDialog1.Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) saveFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) saveFileDialog1->RestoreDirectory = true; // [ヘルプ] ボタンを表示する (初期値 false) saveFileDialog1->ShowHelp = true; // 存在しないファイルを指定した場合は、 // 新しく作成するかどうかの問い合わせを表示する (初期値 false) saveFileDialog1->CreatePrompt = true; // 存在しているファイルを指定した場合は、 // 上書きするかどうかの問い合わせを表示する (初期値 true) //saveFileDialog1->OverwritePrompt = true; // 存在しないファイル名を指定した場合は警告を表示する (初期値 false) //saveFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) //saveFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) //saveFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) //saveFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { System::IO::StreamWriter^ writer = gcnew System::IO::StreamWriter(saveFileDialog1->FileName, false, System::Text::Encoding::Default); String^ myText1 = richTextBox1->Text; //リッチテキストに表示されている文字を読み込む writer->Write(myText1); //リッチテキスト表示文字以外の文字追加 writer->Write("\r\n"); // 改行文字の書き込み writer->Write("\r\n"); // 改行文字の書き込み writer->Write("\r\n"); // 改行文字の書き込み writer->Write("Hellow"); // 文字列の書き込み writer->Write(123); // 数値の書き込み writer->Write("\r\n"); // 改行文字の書き込み writer->WriteLine("World"); // 文字列の書き込み(1行分) writer->Close(); String^ str = saveFileDialog1->FileName; //ダイアログのタイトルをフルパスのファイル名に変更 this -> Text = str; } // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete saveFileDialog1; } |
|
<実行結果> | |
![]() |
![]() |
C、C++言語のソースコードからコメントを削除するプログラムです。 以下を削除しています。 @ /* 〜 */の間のコメント A //...... のコメント 但し、"...................."に記載される /* ....*/ (printf("/* abcd */); や//(printf("//........");などのリテラル文字は削除しないようにしています。 |
|
<プログラム例> private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "myDialog"; openFileDialog1->InitialDirectory = "c:\\";// 初期表示するディレクトリを設定する openFileDialog1->Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル|*.*";// ファイルのフィルタを設定する openFileDialog1->FilterIndex = 1;// ファイルの種類 の初期設定=1 // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { // StreamReader の新しいインスタンスを生成する System::IO::StreamReader^ cReader = ( gcnew System::IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::Default) ); // ファイルの最後まで読み込む String^ stBuffer = cReader->ReadToEnd(); // cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照) cReader->Close(); richTextBox1->Text = stBuffer; String^ str = openFileDialog1->FileName; //ダイアログのタイトルをフルパスのファイル名に変更 this -> Text = str; // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete openFileDialog1; // 左記コードはコンパイラNG:openFileDialog1->Dispose(); } } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Clear(); //画面クリア } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { int ix = 0; int Num = 0; String^ str = richTextBox1->Text; //テキストボックスに表示されている文字列を取得する。 int len = str->Length; // try{ while(1) { //-----文字列リテラルが /*...*/ や //...の前にある場合 if(str[ix] == '\"') //(例)printf("//abc"); printf("/*abc*/");など { while(1) { ix++; if(str[ix] == '\"')break; } } //----- 複数行コメント(/*....*/) の場合 if((str[ix] == '/') && (str[ix + 1] == '*')) { while(1) { if((str[ix + 2 + Num] == '*') && (str[ix + 3 + Num] == '/'))break; Num++; } str = str->Remove(ix,4 + Num); // Num = 0; } ix++; } } catch(Exception^ ) { } richTextBox1->Clear(); //画面クリア richTextBox1->Text = str; ix = 0; Num = 0; try{ while(1) { //-----文字列リテラルが /*...*/ や //...の前にある場合 if(str[ix] == '\"') //(例)printf("//abc"); printf("/*abc*/");など { while(1) { ix++; if(str[ix] == '\"')break; } } //---- 一行コメントの場合、改行コードまでを削除 if((str[ix] == '/') && (str[ix + 1] == '/')) { while(1) { if(str[ix + 2 + Num] == '\n')break; Num++; } str = str->Remove(ix,2 + Num); Num = 0; } ix++; } } catch(Exception^ ) { } richTextBox1->Clear(); //画面クリア richTextBox1->Text = str; } }; } |
|
<実行結果> | |
コメント削除ボタン: クリック前 | コメント削除ボタン: クリック後 |
![]() |
![]() |
フォームアプリケーションから コンソールアプリケーションを起動してその出力を表示するプログラムです。 ボタンをクリックするとそれぞれ指定のコンソールアプリケーションが起動し、その出力をリッチテキストに 表示するプログラムです。 それぞれのコンソールアプリケーションは事前に実行ファイルを作成しておき、 所要のフォルダに配置しておきます。 |
|
Form1.h 抜粋 <プログラム例> #pragma once namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Diagnostics; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Process^ process = gcnew Process(); process->StartInfo->UseShellExecute = false; process->StartInfo->RedirectStandardOutput = true; // 標準出力をリダイレクト process->StartInfo->CreateNoWindow = true; // コンソールウィンドウを表示しない //実行ファイル指定 process->StartInfo->FileName = "ConsoleApp_Hellow.exe"; // 実行するファイル process->Start(); process->WaitForExit(); String^ output = process->StandardOutput->ReadToEnd(); richTextBox1->Text = output; //コンソール出力をフォームのリッチテキストに表示する process->Close(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Process^ process = gcnew Process(); process->StartInfo->UseShellExecute = false; process->StartInfo->RedirectStandardOutput = true; // 標準出力をリダイレクト process->StartInfo->CreateNoWindow = true; // コンソールウィンドウを表示しない //フォームアプリの実行ファイルと同じフォルダにコンソールアプリの実行ファイルをセット //絶対パスで実行ファイルを呼び出し process->StartInfo->FileName = "c:\\MyApp\\ConsoleApp_Spring2.exe"; // \ → \\:必須// 実行するファイル // process->StartInfo->FileName = "c:\MyApp\ConsoleApp_Spring2.exe"; // <-- NG : 実行エラー process->Start(); process->WaitForExit(); String^ output = process->StandardOutput->ReadToEnd(); richTextBox1->Text = output; //コンソール出力をフォームのリッチテキストに表示する process->Close(); } //---------------------------------------------------------------------------------------------- // ConsoleApp_Hellow.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" using namespace System; ////Visual C++のメイン関数の種類 ////main 関数 = C/C++標準 ////wmain 関数 = Visual C++拡張。引数の文字セットは UNICODE(UTF-16) ////_tmain 関数 = Visual C++拡張。ビルド時の文字セット切り替え可能 ////WinMain 関数 = Windowsの機能 = Win32 API // ////ソリューションエクスプローラ:プロジェクト名右クリック→プロパティのページを表示 ////プロジェクトのプロパティ:構成→すべての構成: //// 全般:共通ランタイムサポート→共通言語ランライム(/clr) // //実行ファイル*.exeの名前(*)はソリューションエクスプローラのソリューション名となる int main() //int main(int argc, _TCHAR* argv[]) { Console::WriteLine("Hellow"); Console::WriteLine("World !!"); Console::WriteLine("Akihabara"); Console::WriteLine("AKB48"); return 0; } //------------------------------------------------------------------------------------------- using namespace System; ////Visual C++のメイン関数の種類 ////main 関数 = C/C++標準 ////wmain 関数 = Visual C++拡張。引数の文字セットは UNICODE(UTF-16) ////_tmain 関数 = Visual C++拡張。ビルド時の文字セット切り替え可能 ////WinMain 関数 = Windowsの機能 = Win32 API // ////ソリューションエクスプローラ:プロジェクト名右クリック→プロパティのページを表示 ////プロジェクトのプロパティ:構成→すべての構成: //// 全般:共通ランタイムサポート→共通言語ランライム(/clr) // //実行ファイル*.exeの名前(*)はソリューションエクスプローラのソリューション名となる int main() //int main(int argc, _TCHAR* argv[]) { Console::WriteLine("Spring"); Console::WriteLine("Summer"); Console::WriteLine("Autumn"); Console::WriteLine("Winter"); return 0; } |
|
<実行結果> | |
SpringBtn ボタンをクリックした場合![]() |
HellowBtnをクリックした場合![]() |
■ バイナリーファイルをバイト配列として 一括で開き、一括で保存する
バイナリーファイルをバイト配列として、一括で開き 一括で表示して、一括で保存する例です。 テキストファイルでも開けるので、正確にはファイルをバイト配列で開くと云った方がよいのかもしれません |
<プログラム例> #pragma once namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { //グローバル変数 array<Byte>^ myData; //バイト配列を宣言 public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //開く { // OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); // ダイアログのタイトルを設定する openFileDialog1->Title = "ダイアログのタイトルをココに書く"; // 初期表示するディレクトリを設定するgc openFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する openFileDialog1->FileName = "初期表示するファイル名をココに書く"; // ファイルのフィルタを設定する openFileDialog1->Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) openFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // [読み取り専用] チェックボックスをオンにする (初期値 false) openFileDialog1->ReadOnlyChecked = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { myData = File::ReadAllBytes(openFileDialog1->FileName); // 読み込み } } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) //保存 { // SaveFileDialog の新しいインスタンスを生成するい) SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog(); // ダイアログのタイトルを設定する saveFileDialog1->Title = "ここにダイアログのタイトルを書いてください"; // 初期表示するディレクトリを設定する saveFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する saveFileDialog1->FileName = "ファイル名(.txt)"; // ファイルのフィルタを設定する saveFileDialog1->Filter = "テキスト ファイル(.txt)|*.txt"; //saveFileDialog1.Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) saveFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) saveFileDialog1->RestoreDirectory = true; // [ヘルプ] ボタンを表示する (初期値 false) saveFileDialog1->ShowHelp = true; // 存在しないファイルを指定した場合は、 // 新しく作成するかどうかの問い合わせを表示する (初期値 false) saveFileDialog1->CreatePrompt = true; // 存在しているファイルを指定した場合は、 // 上書きするかどうかの問い合わせを表示する (初期値 true) //saveFileDialog1->OverwritePrompt = true; // 存在しないファイル名を指定した場合は警告を表示する (初期値 false) //saveFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) //saveFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) //saveFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) //saveFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する String^ str = saveFileDialog1->FileName; //ダイアログのタイトルをフルパスのファイル名に変更 this -> Text = str; if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { File::WriteAllBytes(saveFileDialog1->FileName, myData); //ファイルに配列myData[]全部を保存 } // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete saveFileDialog1; } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) //表示 { //超高速16進表示 richTextBox1->Text = BitConverter::ToString(myData); //バイト列を16進数文字列に変換 //1秒以下 richTextBox1->Text = richTextBox1->Text->Replace("-", ",0x");//-を0xに置き換え richTextBox1->Text = "0x" + richTextBox1->Text;//先頭にも0xを追加してリッチテキストボックスに表示 MessageBox::Show ("表示が完了しました", "連絡", MessageBoxButtons::OK, //YesNo MessageBoxIcon::Information, //アイコンのデザイン選択 Error: X Exclamation: ! MessageBoxDefaultButton::Button1); //フォーカスの位置 //推奨ボタン } |
<実行結果>![]() |
■ バイナリーファイル: バイト配列として 逐次開き、保存する(Read/Write)
バイナリーファイルをバイト配列として、Read/Writeメソッドをつかい、512バイト単位で開き 一括で表示して、一括で保存する例です。 |
Form1.h 抜粋 <プログラム例> namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; //Fileシステムに必須 /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { //グローバル変数 array<Byte>^ myData; //バイト配列を宣言 public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { // OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); // ダイアログのタイトルを設定する openFileDialog1->Title = "ダイアログのタイトルをココに書く"; // 初期表示するディレクトリを設定するgc openFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する openFileDialog1->FileName = "初期表示するファイル名をココに書く"; // ファイルのフィルタを設定する openFileDialog1->Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) openFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // [読み取り専用] チェックボックスをオンにする (初期値 false) openFileDialog1->ReadOnlyChecked = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { myData = File::ReadAllBytes(openFileDialog1->FileName); // 読み込み // FileStreamのインスタンスを生成する FileStream^ fs = gcnew FileStream( openFileDialog1->FileName, FileMode::Open, FileAccess::Read); int fileSize = (int)fs->Length; // ファイルのサイズ int readSize; // Readメソッドで読み込んだバイト数 int remain = fileSize; // 読み込むべき残りのバイト数 int bufPos = 0; // データ格納用配列内の追加位置 while (remain > 0) { readSize = fs->Read(myData, bufPos, Math::Min(512, remain)); // 512Bytesずつ読み込む bufPos += readSize; remain -= readSize; } // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete openFileDialog1; } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Text = BitConverter::ToString(myData); //16進数表示 } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { // SaveFileDialog の新しいインスタンスを生成するい) SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog(); // ダイアログのタイトルを設定する saveFileDialog1->Title = "ここにダイアログのタイトルを書いてください"; // 初期表示するディレクトリを設定する saveFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する saveFileDialog1->FileName = "ファイル名(.txt)"; // ファイルのフィルタを設定する saveFileDialog1->Filter = "テキスト ファイル(.txt)|*.txt"; //saveFileDialog1.Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) saveFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) saveFileDialog1->RestoreDirectory = true; // [ヘルプ] ボタンを表示する (初期値 false) saveFileDialog1->ShowHelp = true; // 存在しないファイルを指定した場合は、 // 新しく作成するかどうかの問い合わせを表示する (初期値 false) saveFileDialog1->CreatePrompt = true; // 存在しているファイルを指定した場合は、 // 上書きするかどうかの問い合わせを表示する (初期値 true) //saveFileDialog1->OverwritePrompt = true; // 存在しないファイル名を指定した場合は警告を表示する (初期値 false) //saveFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) //saveFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) //saveFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) //saveFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する String^ str = saveFileDialog1->FileName; //ダイアログのタイトルをフルパスのファイル名に変更 this -> Text = str; if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { //ファイルを作成して書き込む //ファイルが存在しているときは、上書きする FileStream^ fs = gcnew FileStream( saveFileDialog1->FileName, FileMode::Create,//ファイルが存在する場合は、上書きする。 //存在しない場合は、新たに作成する。書き込み時にのみ使用できる。 FileAccess::Write); //書込みモード //バイト型配列の内容をすべて書き込む fs->Write(myData, 0, myData->Length); // (書き込むバイト配列,書込み開始位置,書込むバイト数)//Writeメソッドには戻り値なし // Buf.Length : 全バイト配列 //閉じる fs->Close(); } // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete saveFileDialog1; } |
<実行結果>![]() |
■ バイナリーファイル: Seekで指定した位置から 指定長さ(バイト数)だけファイルを開く
オフセット3( シーク位置 Seek = 3 )バイトの位置から、5バイトの長さでファイルを開いた(データを読み出してバイト配列にした)例です。 |
<プログラム例> // Form1.h 抜粋 namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { //グローバル変数 array<Byte>^ myData; //バイト配列を宣言 array<Byte>^ myData1; public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //全部開く { // OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); // ダイアログのタイトルを設定する openFileDialog1->Title = "ダイアログのタイトルをココに書く"; // 初期表示するディレクトリを設定するgc openFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する openFileDialog1->FileName = "初期表示するファイル名をココに書く"; // ファイルのフィルタを設定する openFileDialog1->Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) openFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // [読み取り専用] チェックボックスをオンにする (初期値 false) openFileDialog1->ReadOnlyChecked = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { // FileStreamのインスタンスを生成する FileStream^ fs = gcnew FileStream( openFileDialog1->FileName, FileMode::Open, FileAccess::Read); int filesize; filesize = (int)fs->Length; //必須//キャストしてのファイルサイズ使用 myData1 = gcnew array<Byte>(filesize); //★★バイト配列の初期化 fs->Read(myData1, 0, filesize); // ファイル全部を読込む // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete openFileDialog1; } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox2->Text = BitConverter::ToString(myData1); //表示 } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e)//Seek位置から開く { // OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない) OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); // ダイアログのタイトルを設定する openFileDialog1->Title = "ダイアログのタイトルをココに書く"; // 初期表示するディレクトリを設定するgc openFileDialog1->InitialDirectory = "c:\\"; // 初期表示するファイル名を設定する openFileDialog1->FileName = "初期表示するファイル名をココに書く"; // ファイルのフィルタを設定する openFileDialog1->Filter = "テキスト ファイル|*.txt;*.log|すべてのファイル|*.*"; // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) openFileDialog1->FilterIndex = 2; // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) openFileDialog1->RestoreDirectory = true; // 複数のファイルを選択可能にする (初期値 false) openFileDialog1->Multiselect = true; // [ヘルプ] ボタンを表示する (初期値 false) openFileDialog1->ShowHelp = true; // [読み取り専用] チェックボックスを表示する (初期値 false) openFileDialog1->ShowReadOnly = true; // [読み取り専用] チェックボックスをオンにする (初期値 false) openFileDialog1->ReadOnlyChecked = true; // 存在しないファイルを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckFileExists = true; // 存在しないパスを指定した場合は警告を表示する (初期値 true) openFileDialog1->CheckPathExists = true; // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) openFileDialog1->AddExtension = true; // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) openFileDialog1->ValidateNames = true; // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { // FileStreamのインスタンスを生成する FileStream^ fs = gcnew FileStream( openFileDialog1->FileName, FileMode::Open, FileAccess::Read); int readNumfile = 3; //ファイルにおける、読出し開始のオフセット(バイト) int readSize0 = 5; //Readメソッドで読み込もうとするバイト数 int bufPos = 0; //読み込んだ値を格納する配列のオフセット(先頭番号) myData = gcnew array<Byte> (5); // データ格納用配列初期化 //★★★ OKコード--> array<Byte>^ myData = gcnew array<Byte> (5); fs->Seek(readNumfile, SeekOrigin::Begin); //ファイルの先頭から3バイト目にSeek位置を移動 fs->Read(myData, bufPos,readSize0); // 5btesだけ読み込み、データ格納用配列内の0から保存する // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) delete openFileDialog1; } } private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) //表示 { richTextBox1->Text = BitConverter::ToString(myData); }
|
<実行結果>![]() |
■ 文字列のコンテキストに従った Copy・Pasete・Cut・Delete・Clear
・文字列をコンテキストにしたがって、コピー、貼り付け、切り取り、削除、画面クリアする例です。 コマンドはコンテキスト(操作の流れ、文脈)に従いをショートカットメニューに表示しています。 ・コーディング先立ち ツールボックスからcontextMenueStripを選択して、各richTextBoxにドロップします。 そして、各リッチテキストのcontextMenuStripプロパティにそれぞれのcontextMenuStripを設定します。 |
|
<プログラム例> namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } private: System::Void cutToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) //Cut { richTextBox1->Cut(); } private: System::Void copyToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//Copy { richTextBox1->Copy(); } private: System::Void paseteToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//Paste { richTextBox1->Paste(); } private: System::Void deleteToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) //Delete { richTextBox1->Text = ""; } private: System::Void clearToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//Clear { richTextBox1->Clear(); } private: System::Void 切り取りToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//切り取り { richTextBox1->Cut(); } private: System::Void コピーToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) //コピー { richTextBox2->Copy(); } private: System::Void 貼り付けToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//貼り付け { richTextBox2->Paste(); } private: System::Void 削除ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) //削除 { richTextBox2->Text = ""; } private: System::Void クリアToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//クリア { richTextBox2->Clear(); } |
|
<実行結果> | |
<左のリッチテキストから文字列コピー>![]() |
<右のリッチテキストに文字列をペースト>![]() |
■ リッチテキストボックスで、指定行の文字列を他の指定行にコピーする
リッチテキストボックスで、指定した行の文字列をコピーして他の指定行の文字列に貼り付け追加する例です。 コピーに伴い、コピーされる側のリッチテキストの行番号が一部変わるので配慮が必要となります |
|
<プログラム例> #pragma once namespace CWhiteForm { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要、 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // richTextBox1->ForeColor = Color::Red; richTextBox1->Text = "00000\n11111\n22222\n33333\n44444\n5555\n6666\n7777\n8888\n9999"; richTextBox2->Text = "aaaaa\nbbbbb\nccccc\nddddd\neeeee\nffff\ngggg\nhhhh\niiii\njjjj\nkkkk\nllll"; } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //文字列の String^ 配列の 生成と初期化 // Create a string array and store the contents of the Lines property. array<String^>^ tempArray = gcnew array<String^>( richTextBox1->Lines->Length ); tempArray = richTextBox1->Lines; int N1 = richTextBox1->GetFirstCharIndexFromLine(2); //2行目の先頭インデックスを取得 int L0; //コピーする文字列の数 含む各\n String^ str; for(int i = 0 ; i < 4; i++) { str = (String^)tempArray[2 + i]; L0 = L0 + str->Length + 1; } richTextBox1->Select(N1,L0 ); //2行目- (2 + 3)行目の文字列を選択 richTextBox1->Copy(); int N2 = richTextBox2->GetFirstCharIndexFromLine(3);//4行目の先頭インデックスを取得 richTextBox2->Select(N2, 0); richTextBox2->Paste(); } }; }
|
|
<実行結果> | |
<実行前>![]() |
<実行前>![]() |
StringBuilderを使うと高速で文字列の処理が可能となります。Stringオブジェクトは、その内容を変更することができません。 したがって、Stringオブジェクトを連結、置換、挿入する場合、その度に新しいStringオブジェクトが作成されてしまいます。これに対して 内容を変更できる文字列で具現化したクラスが、StringBuilderクラスです。StringBuilderオブジェクトに対して文字列の追加、置換、 挿入を行うと、そのオブジェクトの内容が変更されるだけで、新しいオブジェクトを作成されません。そのため、同じ文字列に対して これらの処理を繰り返す場合は、Stringクラスの代わりにStringBuilderクラスを使うことでパフォーマンスが向上します 以下は String^ とStringBuilderを使って文字を100,000個追加した場合の処理時間を比較した結果です。 String^ の場合が3,369msecでStringBuilderの場合が47msecでした。 StringBuilderの方が71.7倍(= 3369/47)高速でした。 StringBuilderの 威力は文字列処理が複雑なほど また繰り返しの回数が増大すればするほど加速度的に増大するようです。 尚、StringBuilderを使用する場合は namespaceにSystem::Text を使いする必要があります。 |
|
<プログラム例> ..... ..... using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Text; //StringBuilderに必須 ..... ,,,,, #pragma endregion private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Clear(); textBox1->Clear(); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //string { String^ s = "A"; //String型を使って文字列を追加していく int t1 = Environment::TickCount; String^ str1 = ""; for (int i = 0; i < 100000; i++) { str1 += s; } t1 = Environment::TickCount - t1; //かかった時間を表示 textBox1->Text = String::Format("String: {0:#,0}msec", t1); richTextBox1->Text = str1; } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)//StringBuilder { String^ s = "A"; //StringBuilderクラスを使って文字列を追加していく int t2 = Environment::TickCount; StringBuilder^ sb = gcnew StringBuilder(); for (int i = 0; i < 1000000; i++) { sb->Append(s); } String^ str2 = sb->ToString(); t2 = Environment::TickCount - t2; //かかった時間を表示 textBox1->Text = String::Format("StringBuilder: {0:#,0}msec", t2); richTextBox1->Text = str2; }
|
|
<実行結果> | |
<String^ >の場合![]() |
<String Builder>の場合![]() |
<プログラム例>
main() { }