[C++Builder]サンプルコード

過去の自分のwikiより転載
おそらく2006年4月より前に書いているはずの内容ですが、wikiの日付に合わせた日付にしています。

=====
修士のときにとある実験装置で取得したデータをカレイダグラフで読みやすく変換するコード
環境はbuilder、ヘッダは略

//---------------------------------------------------------------------------
 #include <vcl.h>
 #pragma hdrstop
 #include <stdio.h>
 #include <fstream.h>
 #include <vector.h>
 #include "Unit1.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma resource "*.dfm"
 TForm1 *Form1;
 //---------------------------------------------------------------------------
    AnsiString currStr[]={"1e-3",
                          "1e-4",
                          "1e-5",
                          "1e-6",
                          "1e-9"};
 //---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::ChangeFile_RAW(AnsiString FileName)
 {
    StatusBar1->Panels->Items[0]->Text="変換始めます";
   ifstream rrr;
   ofstream www;
    AnsiString date=ExtractFileName(FileName.c_str()).SubString(1,ExtractFileName(FileName.c_str()).AnsiPos("RAW_up.txt"));
    AnsiString Path = ExtractFilePath(FileName.c_str());
    rrr.open(FileName.c_str());
    char SampleName[512];
    AnsiString TempSampleName;
    AnsiString SaNe[10];  //サンプルの名前。要素の数は下のMaxSampleNumと同じ
    int MaxSampleNum=10;  //最大4ch*2+5ch+温度の10つ
    int SampleNum;  //サンプルの数
    int PointNum=0; //測定点の数
    int PosNeg=2;   //正負二つのデータがあるので
    //一行目、サンプルネームの取り出し
    rrr.getline(SampleName,sizeof(SampleName));
    TempSampleName=AnsiString(SampleName)+"\t";
    int y=0;
    for(int i=0;i<maxSampleNum;i++){
      y=TempSampleName.AnsiPos("\t");
      SaNe[i]=TempSampleName.SubString(1,y-1);
      TempSampleName.Delete(1,y);
      if(TempSampleName==""){
         SampleNum=i;
         break;
      }
    }
    //データの取り出し
    data.clear();
    data.resize(1024);
    resis.clear();
    resis.resize(1024);
    while(!rrr.eof()){
      data[PointNum].resize(SampleNum+1);
      resis[PointNum].resize(SampleNum+1);
      for(int t=0;t<(SampleNum+1)/2;t++){
      data[PointNum][t].resize(PosNeg);
        rrr >> data[PointNum][t][0];
        rrr >> data[PointNum][t][1];
  //      Memo1->Lines->Add(data[PointNum][t][0]);
   //     Memo1->Lines->Add(data[PointNum][t][1]);
        if(t==(SampleNum+1)/2-1)
          resis[PointNum][t]=data[PointNum][t][1];
        else //if(SaNe[t]="ch1-")
          resis[PointNum][t]=(data[PointNum][t][0]-data[PointNum][t][1])/2;
   //     Memo1->Lines->Add(resis[PointNum][t]);
      }
    PointNum++;
    }
    rrr.close();
    //書き込む
    for(int i=0;i<sampleNum;i++){
      www.open((Path+date+SaNe[i]+".dat").c_str());
 //     www << (SaNe[i]+"\t"+SaNe[SampleNum]+"\n").c_str();
      www << "Resistance [\\fW]";
      www << "\t";
      www << "Temperature [K]";
      www << "\n";
        for(int q=0;q<pointNum-2;q++){
          www << resis[q][i];
          www << "\t";
          www << resis[q][SampleNum+1];
          www << "\n";
      }
      www.close();
    }
    StatusBar1->Panels->Items[0]->Text="変換終了";
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::ChangeFile_up(AnsiString FileName)
 {
    StatusBar1->Panels->Items[0]->Text="変換始めます";
   ifstream rrr;
   ofstream www;
    AnsiString date=ExtractFileName(FileName.c_str()).SubString(1,ExtractFileName(FileName.c_str()).AnsiPos("_up.txt"));
    AnsiString Path = ExtractFilePath(FileName.c_str());
    rrr.open(FileName.c_str());
    char SampleName[512];
    AnsiString TempSampleName;
    AnsiString SaNe[5];  //サンプルの名前。要素の数は下のMaxSampleNumと同じ
    int MaxSampleNum=5;  //最大4ch+温度の5つ
    int SampleNum;  //サンプルの数
    int PointNum=0; //測定点の数
    //一行目、サンプルネームの取り出し
    rrr.getline(SampleName,sizeof(SampleName));
    TempSampleName=AnsiString(SampleName)+"\t";
    int y=0;
    for(int i=0;i<maxSampleNum;i++){
      y=TempSampleName.AnsiPos("\t");
      SaNe[i]=TempSampleName.SubString(1,y-1);
      TempSampleName.Delete(1,y);
      if(TempSampleName==""){
         SampleNum=i;
         break;
      }
    }
    //データの取り出し
    resis.clear();
    resis.resize(1024);
    while(!rrr.eof()){
      resis[PointNum].resize(SampleNum+1);
      for(int t=0;t<sampleNum+1;t++){
        rrr >> resis[PointNum][t];
      }
    PointNum++;
    }
    rrr.close();
    //書き込む
    for(int i=0;i<sampleNum;i++){
      www.open((Path+date+SaNe[i]+".dat").c_str());
 //     www << (SaNe[i]+"\t"+SaNe[SampleNum]+"\n").c_str();
      www << "Resistance [\\fW]";
      www << "\t";
      www << "Temperature [K]";
      www << "\n";
        for(int q=0;q<pointNum-1;q++){
          www << resis[q][i];
          www << "\t";
          www << resis[q][SampleNum];
          www << "\n";
      }
      www.close();
    }
    StatusBar1->Panels->Items[0]->Text="変換終了";
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
    TStringList *TempList = new TStringList; // リストを宣言する
    try{
       for(int y=0;y<sizeof(currStr)/4;y++)
          TempList->Add(currStr[y]);
       ComboBox1->Items->AddStrings(TempList);
       ComboBox2->Items->AddStrings(TempList);
       ComboBox3->Items->AddStrings(TempList);
       ComboBox4->Items->AddStrings(TempList);
       ComboBox5->Items->AddStrings(TempList);
    }
    __finally{
      delete TempList; // リストオブジェクトを破棄する
    }
    ComboBox1->ItemIndex=3;
    ComboBox2->ItemIndex=3;
    ComboBox3->ItemIndex=3;
    ComboBox4->ItemIndex=3;
    ComboBox5->ItemIndex=2;
   DragAcceptFiles(Handle, True); //ドラッグ&ドロップを有効にする
   StatusBar1->Panels->Items[0]->Text="ドラッグ&ドロップできます。";
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::ReceiveDropFiles(TWMDropFiles Message)
 {
   HDROP &Drop = (HDROP)Message.Drop;                    //Message.Drop へのエイリアス
   int Files = DragQueryFile(Drop, 0xFFFFFFFF, NULL, 0); //ドロップされたファイル数の取得
 //  StatusBar1->SimpleText = " ファイル数 "+ IntToStr(Files)+" 個";//ステータスバーにファイル数を表示
   for (int n = 0; n < Files; n++){             //ファイル数分繰り返す
     const int NameMax = 1024;                  //ファイル名用のバッファーサイズ (多少大きめにしている)
     char FileName[NameMax + 10];               //ファイル名用のバッファー (バグ/ミスの予防に、数バイトの余裕を持たせている)
     DragQueryFile(Drop, n, FileName, NameMax); //ファイル名を取得
     if(TabControl1->TabIndex==0)ChangeFile_up(FileName);
     if(TabControl1->TabIndex==1)ChangeFile_RAW(FileName);
   }
   DragFinish(Drop); //ハンドルが使用しているメモリーを解放
 }
 //---------------------------------------------------------------------------

コメント

タイトルとURLをコピーしました