文字と数字が混在するテキストファイルの扱いについて

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

文字と数字が混在するテキストファイルの扱いについて

#1

投稿記事 by VV » 10年前

こんばんは。

文字と数字が混在するファイルの扱いについて分からないところがあります。
例えば、以下の内容のテキストファイルがあるとします。


今日の平均気温は
函館
24
仙台
26
横浜
25
です。


以上がファイルの内容とします。
このようなファイルが2つある(ただし気温の数字は異なる)として、そのファイル同士の平均気温(函館は何度、仙台は何度)を計算し、再度同じ形式でファイルを作りたいです。
このような場合、文字と数字があるので単純にファイルごとに配列に格納し、二つの配列のi番目の値を足して2で割る、という方法で平均を求める事ができません。

どなたかこれを解決する方法を教えていただけたら幸いです。よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字と数字が混在するテキストファイルの扱いについて

#2

投稿記事 by みけCAT » 10年前

VV さんが書きました:このような場合、文字と数字があるので単純にファイルごとに配列に格納し、二つの配列のi番目の値を足して2で割る、という方法で平均を求める事ができません。
無理に配列に格納せず、素直に入力したデータをすぐに計算して出力すればいいと思います。
また、「文字と数字がある」ことと「単純にファイルごとに配列に格納し(略)できません」ということの関係がよくわかりません。
なぜそう判断したのでしょうか?VVさんの環境で利用可能なプログラミング言語は何でしょうか?

とりあえず、C言語で適当なプログラムを書いてみました。
指定されたファイルの形式のみに対応した、適当なプログラムです。

コード:

#include <stdio.h>

int main(int argc, char *argv[]) {
	const int header_num = 1;
	const int content_num = 3;
	const int footer_num = 1;
	int i;
	char buffer1[1024];
	char buffer2[1024];
	double val1,val2;
	FILE* fp1;
	FILE* fp2;
	FILE* fpout;
	if(argc!=4) {
		fputs("please specify input1, input2 and output file\n", stderr);
		return 1;
	}
	fp1=fopen(argv[1],"r");
	fp2=fopen(argv[2],"r");
	if(fp1==NULL || fp2==NULL) {
		fputs("input file open error\n", stderr);
		if(fp1!=NULL)fclose(fp1);
		if(fp2!=NULL)fclose(fp2);
		return 1;
	}
	fpout=fopen(argv[3],"w");
	if(fpout==NULL) {
		fputs("output file open error\n", stderr);
		fclose(fp1);
		fclose(fp2);
		return 1;
	}

	for(i=0;i<header_num;i++) {
		fgets(buffer1,sizeof(buffer1),fp1);
		fgets(buffer2,sizeof(buffer2),fp2);
		fputs(buffer1,fpout);
	}
	for(i=0;i<content_num;i++) {
		fgets(buffer1,sizeof(buffer1),fp1);
		fgets(buffer2,sizeof(buffer2),fp2);
		fputs(buffer1,fpout);
		fgets(buffer1,sizeof(buffer1),fp1);
		fgets(buffer2,sizeof(buffer2),fp2);
		if(sscanf(buffer1,"%lf",&val1)==1 && sscanf(buffer2,"%lf",&val2)==1) {
			fprintf(fpout,"%g\n",(val1+val2)/2.0);
		} else {
			fputs("number convert error\n",fpout);
		}
	}
	for(i=0;i<footer_num;i++) {
		fgets(buffer1,sizeof(buffer1),fp1);
		fgets(buffer2,sizeof(buffer2),fp2);
		fputs(buffer1,fpout);
	}

	fclose(fp1);
	fclose(fp2);
	fclose(fpout);
	return 0;
}
添付ファイル
mozitosuuzigakonzaisurutekisutofairu.zip
ソース、テスト用入力、バイナリ
(22.87 KiB) ダウンロード数: 109 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字と数字が混在するテキストファイルの扱いについて

#3

投稿記事 by かずま » 10年前

こんなやり方もあるということで。
わからないところは、また質問してください。

コード:

#include <stdio.h>

int main(void)
{
    char buf[1000];
    double t1, t2; 
    FILE *fp1 = fopen("data1.txt", "r");
    FILE *fp2 = fopen("data2.txt", "r");
    if (!fp1) return printf("can't open data1.txt\n"), 1;
    if (!fp2) return printf("can't open data2.txt\n"), 1;
    while (fscanf(fp1, "%999[^0-9]", buf) == 1) { // 数字以外の文字を読み込む
        fputs(buf, stdout);                       // 数字以外の文字を出力 
        if (fscanf(fp1, "%lf", &t1) != 1) break;  // 数値を読み込む
        fscanf(fp2, "%*999[^0-9]");      // 数字以外の文字を読み捨てる   
        fscanf(fp2, "%lf", &t2);         // 数値を読み込む 
        printf("%.15g", (t1 + t2) / 2);  // 平均値を出力
    }   
    fclose(fp1);
    fclose(fp2);
    return 0;
}
data1.txt

コード:

今日の平均気温は
函館
24
仙台
26
横浜
25
です。
data2.txt

コード:

今日の平均気温は
函館
15
仙台
16
横浜
18
です。
実行結果

コード:

今日の平均気温は
函館
19.5
仙台
21
横浜
21.5
です。

閉鎖

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