C言語関係掲示板

過去ログ

No.472.2つのファイルの比較と整理

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

2つのファイルの比較と整理
投稿者---スイカ(2002/11/11 21:11:07)


突然で申し訳ないのですが、次のプログラムを作ろうとしているのですが、わかりません。

学籍番号と名前の一覧ファイル(data1.txt)、得点と学籍番号の一覧ファイル(data2.txt)の2つのファイルから、
学籍番号、名前、得点が対応するように整理し、ひとつのファイル(output.txt)として出力するプログラム。

data1.txtの中身
1 aoki
2 iwasaki
3 ueno
4 eto
5 ota
6 kaikiri
7 kita
8 kudo
9 konishi
10 sato

data2.txtの中身
90 5
88 1
76 8
72 2
62 10
60 9
55 3
51 7
43 4
38 6

output.txtの中身(これを作ればいい)
1 aoki 88
2 iwasaki 72
3 ueno 55
4 eto 43
5 ota 90
6 kaikiri 38
7 kita 51
8 kudo 76
9 konishi 60
10 sato 62

以下が出来たところまでのプログラムです。(ほとんど出来てませんが・・・)
------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>

int main()
{
int number1;
int point, number2;
char namae[256];
FILE *fp1,*fp2,*fp3;

if(fp1=fopen("data1.txt, "r") == NULL){
printf("data1.txtの読み込みに失敗しました\n");
exit(1);
}

if(fp2=fopen("data2.txt, "r") == NULL){
printf("data2.txtの読み込みに失敗しました\n");
exit(1);
}

if(fp3=fopen("output.txt, "w" == NULL){
printf("output.txtの読み込みに失敗しました\n");
exit(1);
}

while(fscanf(fp1,"%d%s",&number1,s) != EOF){
while(fscanf(fp2,"%d%d",&point,&number2) !=EOF){
fprintf(fp3,"%d\t%s\t%d\n",number1,s,point);
}
}

fclose(fp1);
fclose(fp2);
fclose(fp3);

return 0;
}

---------------------------------------------------------------
長くなりましたけど、よろしくお願いしますm(_)m

No.3422

Re:2つのファイルの比較と整理
投稿者---aki(2002/11/12 00:23:08)


#include <stdio.h>
#include <stdlib.h>

#define TBL_SIZE 100
#define NAME_MAX  30

typedef struct {
    int id;
    int point;
} Record;

Record table[TBL_SIZE];

int cmp(const void *p1, const void *p2)
{
    return ((Record*)p1)->id - ((Record*)p2)->id;
}

FILE *open_file(const char *fname, const char *mode)
{
    FILE *fp = fopen(fname, mode);
    if (fp == NULL)
        fprintf(stderr, "%sのオープンに失敗しました\n", fname), exit(1);
    return fp;
}

int main(void)
{
    int i, id;
    FILE *fp1, *fp2, *wp;
    char name[NAME_MAX];

    fp1 = open_file("data1.txt", "r");
    fp2 = open_file("data2.txt", "r");
    wp  = open_file("output.txt", "w");

    i = 0;
    while (i < TBL_SIZE && fscanf(fp2, "%d%d", &table[i].point, &table[i].id) == 2)
        i++;
    qsort(table, i, sizeof *table, cmp);    

    while (fscanf(fp1, "%d%s", &id, name) == 2) {
        Record key, *p;
        key.id = id;
        p = bsearch(&key, table, i, sizeof *table, cmp);
        if (p != NULL)
            fprintf(wp, "%d %s %d\n", id, name, p->point);
    }
    return 0;
}