ファイルからデータを読み込んで、内部データにデータを設定する処理をプログラミングしてみます。
開発環境(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 件のコメント:
コメントを投稿