ファイル処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

ファイル処理

#1

投稿記事 by 初心者 » 18年前

卒業研究のために実験データのファイルを解析するプログラムをC言語で作ることになりました。

ファイルの形式は~.datで中身は縦に二列、タブ区切りで保存されています。
そのファイルの二列の右側?の値のみから最大の四つの値の平均、最小の四つの値の平均を求めたいのですが、ファイルに保存されている数値が自然対数(たとえば1.3e-4)になっていて、どう扱えばいいかわかりません。

一応調べたのですが、自然対数の計算方法等しか出てこなかったのでこちらで質問させていただきました。

みなさんご教授よろしくおねがいいたします。

管理人

Re:ファイル処理

#2

投稿記事 by 管理人 » 18年前

実験データはこのようにはいっているわけですね。
a	b
c	d
e	f
g	h
実際はもっと多いわけでしょうけど、
で、たとえば右側のb,d,f,hの中から最大の4つ、最小の4つを取り出して平均を求めると。

対数で書かれていても普通にdouble型に格納してもよいのですよね?
でしたら
log (x)
で計算して平均を求めてはいけないのでしょうか。

Justy

Re:ファイル処理

#3

投稿記事 by Justy » 18年前

数値が自然対数(たとえば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:ファイル処理

#4

投稿記事 by 初心者 » 18年前

ご回答ありがとうございます。
doubleでも格納はできるのですね。あとは読み込み方しだいということで、教えていただいたものを参考にしたいと思います。


あと、右側から最大、最小をさがすにはやはりソートを使うのがよいのでしょうか?

もしほかに簡単に使えるプログラムがあればぜひ教えていただきたいです。

管理人

Re:ファイル処理

#5

投稿記事 by 管理人 » 18年前

どちらの処理も過去に何度も回答したものですので、探してみた方が早いかもしれません。
文字をdouble型に変換するにはatof関数を使います。

最大値を探すプログラムも今日のトピにあります。

管理人

Re:ファイル処理

#6

投稿記事 by 管理人 » 18年前

読み込むデータは右側のデータだけでいいんですか?

あ、そういえば4つデータがいるんですね。
ソートは使わなくても出来そうですけど、
難しく考えるよりソートを使った方がいいかもしれません。

keichan

Re:ファイル処理

#7

投稿記事 by keichan » 18年前

>ファイルに保存されている数値が自然対数(たとえば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:ファイル処理

#8

投稿記事 by 管理人 » 18年前

ファイルからデータを取ってきて、

http://dixq.net/sort.html

この辺のソートプログラムをくっつけたらOKだと思います。

後は上から4つ、下から4つとってくれば完了です。

初心者

Re:ファイル処理

#9

投稿記事 by 初心者 » 18年前

アドバイスありがとうございます。
ソートを使ってみたいと思います。

最後にもうひとつだけ質問させてもらいたいのですが。

データファイルの右側のデータ(タブ区切り)のみを読み込むのはどうすればいいのでしょうか?

質問ばかりですいません。。

box

Re:ファイル処理

#10

投稿記事 by box » 18年前

> データファイルの右側のデータ(タブ区切り)のみを読み込むのはどうすればいいのでしょうか?

サンプルです。
#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る