こんばんは。
文字と数字が混在するファイルの扱いについて分からないところがあります。
例えば、以下の内容のテキストファイルがあるとします。
今日の平均気温は
函館
24
仙台
26
横浜
25
です。
以上がファイルの内容とします。
このようなファイルが2つある(ただし気温の数字は異なる)として、そのファイル同士の平均気温(函館は何度、仙台は何度)を計算し、再度同じ形式でファイルを作りたいです。
このような場合、文字と数字があるので単純にファイルごとに配列に格納し、二つの配列のi番目の値を足して2で割る、という方法で平均を求める事ができません。
どなたかこれを解決する方法を教えていただけたら幸いです。よろしくお願いします。
文字と数字が混在するテキストファイルの扱いについて
Re: 文字と数字が混在するテキストファイルの扱いについて
無理に配列に格納せず、素直に入力したデータをすぐに計算して出力すればいいと思います。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: 文字と数字が混在するテキストファイルの扱いについて
こんなやり方もあるということで。
わからないところは、また質問してください。
data1.txt
data2.txt
実行結果
わからないところは、また質問してください。
#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;
}