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形式で保存」などに変更したほうがよいでしょう。