Step 1. データファイルの読み出し、書き出し(応用編)
ここではX線回折データ((株)リガクのフォーマット)を x, y 形式(角度、強度)といくつかの解析ソフトで使うDAT形式のファイルに変換するプログラムを作成します。
基本的には基本編でやったことをファイル形式にあわせてコードを変更するだけです。ここでは以前、他のCコンパイラ用に使ったものをそのまま利用しました。
OnFileOpen, OnFileSave, OnFileSaveAs の関数をそれぞれ次のように書きました。
変数の宣言のいくつかをDocクラスのほうでやりましたので pDoc-> を使っているところがあります。
void CKawView::OnFileOpen()
{
CKawDoc* pDoc = GetDocument();
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog filedlg(TRUE, "dat", "*.dat");
CString filename;
FILE *ifp;
char s[256];
int n,m,k,nd;
if (filedlg.DoModal() == IDOK) {
filename = filedlg.GetPathName();
ifp = fopen(filename, "r");
while (fgets(s,256,ifp)!=NULL){
if (strncmp("*START =",s,17)==0){
pDoc->startA=atof(&s[19]);
}
if (strncmp("*STEP =",s,17)==0){
pDoc->stepA=atof(&s[19]);
}
if (strncmp("*STOP =",s,17)==0){
pDoc->stopA=atof(&s[19]);
}
if (strncmp("*COUNT =",s,17)==0){
pDoc->ndata=atoi(&s[19]);
break;
}
}
nd=0;
while (fgets(s,256,ifp)!=NULL){
m=0;
k=0;
if (strlen(s)<=1) break;
if (strlen(s)) {
for(n=0; n=4) {
m=0;
k=0;
break;
}
if (isspace(s[n]) || s[n]==',') {
m=0;
}
else {
if (m==0) {
k=k+1;
nd=nd+1;
pDoc->y[nd]=atof(&s[n]);
}
m=1;
}
}
}
}
fclose(ifp);
}
pDoc->dMax=pDoc->y[1];
pDoc->dMin=pDoc->y[1];
for (int i=1; i<=pDoc->ndata; i++) {
pDoc->x[i]=pDoc->startA+(i-1)*pDoc->stepA;
if (pDoc->dMax < pDoc->y[i]) {
pDoc->dMax = pDoc->y[i];
}
if (pDoc->dMin > pDoc->y[i]) {
pDoc->dMin = pDoc->y[i];
}
}
Xmin=pDoc->x[1];
Xmax=pDoc->x[pDoc->ndata];
Ymin=pDoc->dMin;
Ymax=pDoc->dMax;
Marq=0;
MRegion=2;
RedrawWindow();
}
void CKawView::OnFileSaveAs()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CKawDoc* pDoc = GetDocument();
CFileDialog filedlg(FALSE, "dat", "*.dat");
CString filename;
FILE *ofp;
int m=0,nd=0;
if (filedlg.DoModal() == IDOK) {
filename = filedlg.GetPathName();
ofp = fopen(filename, "w");
for (int i=0; i<4; i++) {
fprintf(ofp, "\n","");
}
fprintf(ofp, "%8.3f%8.3f%8.3f%10s\n",pDoc->startA,pDoc->stepA,pDoc->stopA,"from RINT");
while (ndndata){
m=m+1;
if (m==11) {
fprintf(ofp, "\n","");
m=0;
}
else {
nd=nd+1;
fprintf(ofp, "%8d", (int)pDoc->y[nd]);
}
}
fprintf(ofp, "\n","");
fclose(ofp);
}
}
void CKawView::OnFileSave()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CKawDoc* pDoc = GetDocument();
CFileDialog filedlg(FALSE, "dat", "*.dat");
CString filename;
FILE *ofp;
int m=0,nd=0;
if (filedlg.DoModal() == IDOK) {
filename = filedlg.GetPathName();
ofp = fopen(filename, "w");
fprintf(ofp, "%d\n", pDoc->ndata);
for (int i=1; i<=pDoc->ndata; i++){
fprintf(ofp, "%f %f\n", pDoc->x[i], pDoc->y[i]);
}
fclose(ofp);
}
}
メニューの変更
上のように ID_File_Save などを利用した場合はメニューの「上書き保存」を「xy形式で保存」などに変更したほうがよいでしょう。