ページ 1 / 1
ファイル処理
Posted: 2006年12月10日(日) 03:02
by 初心者
卒業研究のために実験データのファイルを解析するプログラムをC言語で作ることになりました。
ファイルの形式は~.datで中身は縦に二列、タブ区切りで保存されています。
そのファイルの二列の右側?の値のみから最大の四つの値の平均、最小の四つの値の平均を求めたいのですが、ファイルに保存されている数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません。
一応調べたのですが、自然対数の計算方法等しか出てこなかったのでこちらで質問させていただきました。
みなさんご教授よろしくおねがいいたします。
Re:ファイル処理
Posted: 2006年12月10日(日) 03:18
by 管理人
実験データはこのようにはいっているわけですね。
a b
c d
e f
g h
実際はもっと多いわけでしょうけど、
で、たとえば右側のb,d,f,hの中から最大の4つ、最小の4つを取り出して平均を求めると。
対数で書かれていても普通にdouble型に格納してもよいのですよね?
でしたら
log (x)
で計算して平均を求めてはいけないのでしょうか。
Re:ファイル処理
Posted: 2006年12月10日(日) 03:26
by Justy
>数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません
自然対数であっても atofとか sscanfで読みとればそのまま double型で読めます。
[color=#d0d0ff" face="monospace] double value;
static const char value_str[/url] = "1.3e-4"; // ファイルから読みとってきた文字列としましょう
// 1
printf("value = %f\n", atof(value_str));
// 2
sscanf(value_str, "%lf", &value);
printf("value = %f\n", value);
return 0;
[/color]
Re:ファイル処理
Posted: 2006年12月10日(日) 03:39
by 初心者
ご回答ありがとうございます。
doubleでも格納はできるのですね。あとは読み込み方しだいということで、教えていただいたものを参考にしたいと思います。
あと、右側から最大、最小をさがすにはやはりソートを使うのがよいのでしょうか?
もしほかに簡単に使えるプログラムがあればぜひ教えていただきたいです。
Re:ファイル処理
Posted: 2006年12月10日(日) 03:43
by 管理人
どちらの処理も過去に何度も回答したものですので、探してみた方が早いかもしれません。
文字をdouble型に変換するにはatof関数を使います。
最大値を探すプログラムも今日のトピにあります。
Re:ファイル処理
Posted: 2006年12月10日(日) 03:44
by 管理人
読み込むデータは右側のデータだけでいいんですか?
あ、そういえば4つデータがいるんですね。
ソートは使わなくても出来そうですけど、
難しく考えるよりソートを使った方がいいかもしれません。
Re:ファイル処理
Posted: 2006年12月10日(日) 03:50
by keichan
>ファイルに保存されている数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません。
テキストの保存されている入力形式が一定であるならば下記のようにすれば簡単に取得できます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_COUNT (256)
int main()
{
FILE* fp = NULL;
char* tab_pos = NULL;
double tmp_value;
char file_buf[MAX_LINE_COUNT] = {0};
if( (fp = fopen("test.dat", "r")) == NULL ) {
printf("can't open file.\n");
return 1;
}
/* 1行ずつ file_buf へ読みこむ */
while( fgets(file_buf, MAX_LINE_COUNT, fp) != NULL ) {
/* '\t'(タブ)の位置を検索.なかったらNULLが返ってくる */
if( (tab_pos = strchr(file_buf, '\t')) == NULL ) {
continue;
}
/* 1.2e-4 4.2e-5 */
/* だったらば tmp_value へは 4.2e-5 が入る */
tmp_value = atof(tab_pos+1); /* タブ文字の直後から浮動少数が必ず始まると仮定 */
/* ここで最小・最大判定等ごにょごにょ */
}
fclose(fp);
return 0;
}
Re:ファイル処理
Posted: 2006年12月10日(日) 04:02
by 管理人
ファイルからデータを取ってきて、
http://dixq.net/sort.html
この辺のソートプログラムをくっつけたらOKだと思います。
後は上から4つ、下から4つとってくれば完了です。
Re:ファイル処理
Posted: 2006年12月10日(日) 15:59
by 初心者
アドバイスありがとうございます。
ソートを使ってみたいと思います。
最後にもうひとつだけ質問させてもらいたいのですが。
データファイルの右側のデータ(タブ区切り)のみを読み込むのはどうすればいいのでしょうか?
質問ばかりですいません。。
Re:ファイル処理
Posted: 2006年12月10日(日) 16:28
by box
> データファイルの右側のデータ(タブ区切り)のみを読み込むのはどうすればいいのでしょうか?
サンプルです。
#include <stdio.h>
int main(void)
{
char str[/url] = "1.2e-4\t4.2e-5"; /* ファイルに、こう書いてあるつもり */
double d;
printf("str='%s'\n", str);
sscanf(str, "%*s%lf", &d); /* 1個目のフィールドを読み飛ばす */
printf("d=%f\n", d);
return 0;
}