Up

テキストファイル入出力―その1

平均値の計算

 

テキストファイルからデータを読み込み、計算結果などをテキストファイルへ書き出すプログラムを作成した。データのテキストファイルは図1のような形式である。

図1

 

行の先頭がスラッシュ/で始まる行に挟まれて、データが1行に1つずつ書かれている。データの読み込みのときは、このスラッシュ/で始まる行まで読み飛ばし、次のスラッシュ/で始まる行までデータを各行から1つずつ読み込んでいく。

 プログラムの作成は、まずメニュ「ファイル|新規作成|プロジェクト」を選ぶ(図2)。

図2

 

表示されたダイアログボックス(図3)でプロジェクトの種類「CLR」、テンプレート「Windowsフォームアプリケーション」を選択する。

図3

 

フォームのデザインは、Buttonを2個、Labelを1個、図4のように配置する。さらにOpenFileDialogSaveFileDialogを用意する。

図4

 

コードは以下のように用意する。

 

#pragma endregion

        private: System::Void buttonClose_Click(System::Object^  sender, System::EventArgs^  e) {

                                 Close();

                         }

        private: System::Void buttonGO_Click(System::Object^  sender, System::EventArgs^  e) {

                                 openFileDialog1->FileName = "*.txt";

                                 if (openFileDialog1->ShowDialog() != System::Windows::Forms::DialogResult::OK){

                                         label1->Text = "openFileDialog is canceled";

                                         return;

                                 }

 

                                 try {

                                         FileStream ^ fs = gcnew FileStream(openFileDialog1->FileName, FileMode::Open);

                                         StreamReader ^ fin = gcnew StreamReader(fs,

                                                                                System::Text::Encoding::GetEncoding("Shift-JIS"));

                 

                                         saveFileDialog1->FileName = "";

                                         if (saveFileDialog1->ShowDialog() != System::Windows::Forms::DialogResult::OK){

                                                 label1->Text = "saveFileDialog is canceled";

                                                 return;

                                         }

                                         fs = gcnew FileStream(saveFileDialog1->FileName,FileMode::Create);

                                         StreamWriter ^ fout = gcnew StreamWriter(fs);

 

                                         String ^ s;

 

                                         s = "Data File..." + openFileDialog1->FileName;

                                         fout->WriteLine(s);

 

                                         int ck = 0;

                                         do {

                                                 s = fin->ReadLine()->Trim();

                                                 if (s->Length > 0){

                             if (s[0] == '/') ck = 1;

                                                 }

                                         } while (ck == 0);

 

                                         double x[1000];

                                         double sum = 0.0;

                                         double mean;

                                         int n = 0;

                                         for (;;) {

                                                 s = fin->ReadLine();

                                                 if (s[0] == '/') break;

                                     n++;

                                                 x[n-1] = XmlConvert::ToDouble(s->Trim());

                                                 sum += x[n-1];

                                         }

                                         mean = sum/n;

 

                                         s = "入力データ...";

                                         fout->WriteLine(s);

                                         for (int i = 0; i < n; i++){

                                                 s = (i+1).ToString() + ": " + x[i].ToString();

                                                 fout->WriteLine(s);

                                         }

                                         fout->WriteLine("");

                                         fout->WriteLine("平均値= " + mean.ToString());

 

 

                                         fin->Close();

 

                                         fout->Close();

 

                                         label1->Text = "Output File..." + saveFileDialog1->FileName;

                                 }

                                 catch (Exception ^ e1) {

                                         label1->Text = "Err..." + e1;

                                         return;

                                 }

 

                                 return;

                         }

        };

 

ファイルストリームを用いるために名前空間System::IO、文字列をその表す実数値に変換する関数ToDoubleを用いるために名前空間System::Xmlの使用を宣言しておく(図5)。

図5

 

プログラムを実行すると図6のフォームが表示される。

図6

 

「GO」ボタンをクリックすると図7のように入力データファイル名の設定を求めるダイアログボックスが表示される。

図7

 

図1の形式で用意してあるテキストファイル名を設定後「開く」ボタンをクリックすると、出力ファイル名の設定を求めるダイアログボックスが表示される(図8)。

図8

 

適当な出力用ファイル名を設定して「保存」ボタンをクリックすると指定したファイル名のテキストファイルに書き込みが始まり、終了後図9のように「Output File…」のメッセージが表示される。

図9

 

フォームの右側でメッセージが切れているときは、フォームの端をドラッグすることによりメッセージを全て表示させることができる(図10)。

図10

 

Close」ボタンをクリックするとプログラムの実行終了となる。プログラムの終了後、書き込まれたファイルを開くと図11のようになっている。

図11

 

プログラムのソースファイルは圧縮ファイルcalcmean.ZIPとして用意した。ここをクリックしてダウンロードすることができる。

 

 

Up