卒業研究のために実験データのファイルを解析するプログラムをC言語で作ることになりました。
ファイルの形式は~.datで中身は縦に二列、タブ区切りで保存されています。
そのファイルの二列の右側?の値のみから最大の四つの値の平均、最小の四つの値の平均を求めたいのですが、ファイルに保存されている数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません。
一応調べたのですが、自然対数の計算方法等しか出てこなかったのでこちらで質問させていただきました。
みなさんご教授よろしくおねがいいたします。
ファイル処理
Re:ファイル処理
>数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません
自然対数であっても atofとか sscanfで読みとればそのまま double型で読めます。
自然対数であっても 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:ファイル処理
>ファイルに保存されている数値が自然対数(たとえば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; }