過去の自分の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); //ハンドルが使用しているメモリーを解放
}
//---------------------------------------------------------------------------
コメント