C言語関係掲示板

過去ログ

No.517.ファイルから読み込んだ値を計算

[戻る] [ホームページ]
No.4051

ファイルから読み込んだ値を計算
投稿者---hatsu(2002/12/25 13:08:15)


ファイルから読み込んだ値を計算したいのですが。
例えば、
AAA,10
AAA,20
AAA,30
BBB,10
BBB,10
BBB,20

としますと、
AAA=60
BBB=40

と出力したいのですが、どうすればよいのですか。


No.4055

Re:ファイルから読み込んだ値を計算
投稿者---123(2002/12/25 19:06:24)


以下のようにすればできると思います。
ただ、無用にステップ数を食っています。
他に、良い方法があるかもしれません。

#include <stdio.h>
#include <strings.h>

main()
{
FILE *rfp,*wfp ;
char buff[1024] ;
char *pr ;
char str[1024],w_str[1024] ;
int num,w_num ;

rfp = fopen("text.txt","r") ;
wfp = fopen("kekka.txt","w") ;

/*1レコード目の読み込み。バッファに格納 */
if (fgets(buff,1024,rfp)==NULL) {
fclose(rfp) ;
fclose(wfp) ;
return 0 ;
} else {
buff[strlen(buff)] = '\0' ;
pr = strtok(buff, ",") ;
strcpy(str,pr) ;
pr = strtok(NULL, ",") ;
num = atoi(pr) ;
}
/*2レコード目以降読み込み */
while(fgets(buff,1024,rfp)!=NULL) {
buff[strlen(buff)] = '\0' ;
pr = strtok(buff, ",") ;
strcpy(w_str,pr) ;
pr = strtok(NULL, ",") ;
w_num = atoi(pr) ;

if (strcmp(str,w_str) == 0) {
num = num + w_num ;
} else {
fprintf(wfp,"%s,%d\n",str,num) ;
strcpy(str,w_str) ;
num = w_num ;
}
}
/* 最後のデータを出力 */
fprintf(wfp,"%s,%d\n",str,num) ;
}

No.4067

Re:ファイルから読み込んだ値を計算
投稿者---かずま(2002/12/26 00:53:26)


#include <stdio.h>
#include <string.h>

int main(void)
{
    char buf[256], name[256];  int val, sum = 0;

    *name = '\0';
    while (fscanf(stdin, " %255[^,],%d", buf, &val) == 2) {
        if (strcmp(buf, name)) {
            if (*name) fprintf(stdout, "%s=%d\n", name, sum);
            strcpy(name, buf);
            sum = val;
        } else
            sum += val;
    }
    if (*name) fprintf(stdout, "%s=%d\n", name, sum);
    return 0;
}


No.4068

Re:ファイルから読み込んだ値を計算
投稿者---hatsu(2002/12/26 12:02:35)


皆さん、いろいろとありがとうございます。
123さんのは、変数も多く、ステップ数も多いですね。
かずまさんのは、ステップ数が少なく感心します。

>while (fscanf(stdin, " %255[^,],%d", buf, &val) == 2) {
の行なのですが、「" %255[^,],%d"」で、
「"」と「%」の間に半角スペースが入っているのはどうして
なのですか。

「"」と「%」の間を詰めると、
while (fscanf(stdin, "%255[^,],%d", buf, &val) == 2) {
^^^^^^^^^^^^
とすると、
出力結果がおかしくなります。

先頭の1レコード目にあったものがそのまま出力され、加算されません。
また、各行に改行コードが入り1行の空白ができます。

AAA=10

AAA=50

BBB=40
となります。