C言語関係掲示板

過去ログ

No.394.入力ファイルからある条件をみたす数だけ出力ファイルに書き込むには?

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

入力ファイルからある条件をみたす数だけ出力ファイルに書き込むには?
投稿者---あらいぐま(2002/09/15 21:45:41)


はじめまして、あらいぐまと言う者です。
以前からここのサイトでC言語を勉強させてもらっていますが書き込みは
はじめてです。

いま、自分はファイル入出力の項目を勉強しています。
そこで、皆さんにご質問したいのですが、
例えば、入力ファイルにランダムに1〜10までの数字が入力してあった
として、その入力ファイル中の最大値や中間値だけを出力ファイルに書き込む
ためにはどうすればいいのでしょうか?
ポインタを使ってみてはどうか?とか、fputcで一文字ずつ読み込んでいって
1つずつ比較できないか?などいろいろ考えてはみたのですが漠然とした
ままでプログラムをつくることができません。
皆さん、どうかお教えください。



No.2719

Re:入力ファイルからある条件をみたす数だけ出力ファイルに書き込むには?
投稿者---kamadoma(2002/09/16 18:59:58)


>はじめまして、あらいぐまと言う者です。
>以前からここのサイトでC言語を勉強させてもらっていますが書き込みは
>はじめてです。
>
>いま、自分はファイル入出力の項目を勉強しています。
>そこで、皆さんにご質問したいのですが、
>例えば、入力ファイルにランダムに1〜10までの数字が入力してあった
>として、その入力ファイル中の最大値や中間値だけを出力ファイルに書き込む
>ためにはどうすればいいのでしょうか?
>ポインタを使ってみてはどうか?とか、fputcで一文字ずつ読み込んでいって
>1つずつ比較できないか?などいろいろ考えてはみたのですが漠然とした
>ままでプログラムをつくることができません。
>皆さん、どうかお教えください。
>
#include <stdio.h>
#include <stdlib.h>

FILE *fileOpen(char *,char *);
void getMaxMin(char *,int *,int *);

int main(void)
{
        FILE *in_fp;
        FILE *out_fp;
        char line[256];
        int min = 999;
        int max = -999;

        /*入出力ファイルオープン処理*/
        in_fp = fileOpen("c:\\in.txt","r");
        out_fp = fileOpen("c:\\out.txt","w");

        while(fgets(line,256,in_fp) != NULL){
                /*最大値、最小値を求める*/
                getMaxMin(line,&max,&min);
        }

        /*結果出力処理*/
        fprintf(out_fp,"max = %d\n",max);
        fprintf(out_fp,"min = %d\n",min);

        /*ファイルクローズ処理*/
        fclose(in_fp);
        fclose(out_fp);

        return 0;
}

FILE *fileOpen(char *p_fileName,char *p_mode)
{
        FILE *fp;

        fp = fopen(p_fileName,p_mode);
        if(fp == NULL){
                fprintf(stderr,"ファイル[%s]を開くことができませんでした。\n",p_fileName);
                exit(1);
        }
        
        return fp;
}

void getMaxMin(char *p_line,int *max,int *min)
{
        /*最大値取得処理*/
        if(atoi(p_line) > *max){
                *max = atoi(p_line);
        }
        /*最小値取得処理*/
        if(atoi(p_line) < *min){
                *min = atoi(p_line);
        }
}




No.2751

ありがとうございました。
投稿者---あらいぐま(2002/09/19 22:49:23)


返事が送れて申し訳ありません。
kamadomaさん、お返事ありがとうございます。
非常に見易いプログラムで、しっかりと理解することができました。
これからもより精進すべくがんばっていこうと思います。

No.2752

Re:入力ファイルからある条件をみたす数だけ出力ファイルに書き込むには?
投稿者---かずま(2002/09/19 23:21:04)


> 例えば、入力ファイルにランダムに1〜10までの数字が入力してあった
> として、その入力ファイル中の最大値や中間値だけを出力ファイルに書き込む
#include <stdio.h>

#define MAX_DATA 1000

int max_median(FILE *fin, FILE *fout)
{
    int a[MAX_DATA], n, i, val;
    double median;

    for (n = 0; fscanf(fin, "%d", &val) == 1; n++) {
        if (n >= MAX_DATA) return puts("too many data"), 1;
        for (i = n; i > 0 && a[i-1] > val; i--)
            a[i] = a[i-1];
        a[i] = val;
    }
    puts("---");
    if (!feof(fin)) return puts("wrong data"), 1;
    if (n == 0) return puts("no data"), 1;
    median = (n & 1) ? a[n/2] : (a[n/2-1] + a[n/2]) / 2.0;
    fprintf(fout, "max = %d, median = %g\n", a[n-1], median);
    return 0;
}

int main()
{
    return max_median(stdin, stdout);
}


No.2753

Re:入力ファイルからある条件をみたす数だけ出力ファイルに書き込むには?
投稿者---かずま(2002/09/19 23:28:59)


> 入力ファイルにランダムに1〜10までの数字が入力してあったとして、
    if (val < 1 || val > 10) return puts("wrong data"), 1;
を追加。


No.2798

ありがとうございました。
投稿者---あらいぐま(2002/09/27 17:13:08)


返事が非常に遅れてしまいました。すいません。
かずまさん、教えていただきありがとうございます。
教えていただいたプログラムを参考にしながらさらに精進すべく
頑張っていこうと思います。