2015年9月26日土曜日

【C++の勉強(6)】データファイルを読み込んでみる

ファイルからデータを読み込んで、内部データにデータを設定する処理をプログラミングしてみます。
開発環境(IDE)は、eclipseを使用します。

1、データファイル
以下のようなデータファイルを作成して、eclipseのプロジェクト直下に保存(ファイル名をinput.datとします)します。

7
-3, 5
-2, -2
-1, -3
 0, -1
 1, 1
 2, 4
 3, 5

※1行目がデータ総数、x,yのデータで7個定義

プログラムソース内で外部変数で、ファイル名を定義します。
char fname[] = "input.dat";

2、インクルードファイル
ライブラリ関数(count,printf,atof,strtok)を使用する為、以下のファイルをincludeします。

#include <iostream>  // for cout
#include <stdio.h>   // for printf()
#include <stdlib.h>  // for atof
#include <string.h>  // for strtok



3、ファイルの読み込み
ファイルを読み込んで、変数x,yに登録します。
関数の引数x,yは、ポインタの参照を定義します。
ポインタの参照とすることで、関数内でx,yの変更した値が、関数を出てからも、設定した値が保持されたままとなります。
※ただし、関数でてからnewしたx,yの開放(delete)を忘れないようにします

int main()
{
    double* x = 0;
    double* y = 0;

    read_xy(x, y);

    if ( x != 0 ) delete x;
    if ( y != 0 ) delete y;
    retun 0;
}
ポインタ定義では、NULL(=0)定義を忘れないこと!

void Calc::read_xy(double*& x, double*& y)
{
    FILE* fp;
    char data[256];
    int num = 0;
    int iy = 0 ;
    int ix = 0;
    char *tp;

    if ((fp = fopen(fname, "r")) == NULL)
    {
        printf(" Failure of open file. file name is %s. end of program......\n", fname);
        //exit(1);
        return ;
    }

    if (fp!=NULL)
    {
        while (fgets(data, 256, fp) != 0)
        {
            ix = 0;
            if (iy == 0)
            {
                num = atoi(data);
                x = new double[num];
                y = new double[num];
            } else {
                for (int tc=0;;ix++) {
                    tp=strtok((tc++==0)?data:NULL, ", "); /* divide data in "," and " "*/
                    if (tp!=NULL)
                    {
                        double dval = atof(tp);
                        if ( ix == 0 )
                        {
                            x[iy-1] = dval;
                        } else {
                            y[iy-1] = dval;
                        }
                        ix++ ;
                    }
                    else
                    {
                        ix = 0 ;
                        break;
                    }
                }
            }
            iy++;
        }
    }
    fclose (fp);
}


【参考URL】
http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok
http://www9.plala.or.jp/sgwr-t/lib/strtok.html

0 件のコメント:

コメントを投稿