-1

2つのテキストファイルを1行ずつ読み取り、それらを比較し、重複を削除し、アルファベット順に3番目のファイルにする関数を書くことを想定しています...私はこれに1か月以上取り組んでいますが、まだ立ち往生していますこれを行うためにいくつかの方法を試しましたが、何も思いつきませんでした...これを行うにはstrcmpを使用する必要があり、他の事前定義されたソート機能を使用することはできません...私もこのサイトを見回しましたが、できませんこれに役立つ多くのことを見つけてください...どんな助けも大歓迎です..これまでのところ私が持っているものは次のとおりです:

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


main (void)
{
    char str [200];
    char str2 [200];
    char new [100];
    char temp [100];
    int row = 10;
    FILE *fa = fopen ("book1.dat", "r");
    FILE *fb = fopen ("book2.dat", "r");
    FILE *fc = fopen ("fixed.txt", "w");

    int i;
    int j;
    int k;

    while (fgets (str, 200, fa) !=NULL && fgets (str2, 200, fb) !=NULL)
    {
        puts(str);
        puts(str2);

        if (strcmp( str, str2) ==0 )
        {
            strcpy (str , new);
        } else {
            strcpy (new, str);
            strcpy (new, str2);
        }
    }
    for ( i = 0; i < row; i++)
    {
        for (j = i+1; j< row; j++)
        {
            if(strcmp(new[i], new [j]) > 0)
            {
                strcpy (temp, new);
                strcpy(new, new);
                strcpy(new, temp);
            }
        }
    }
    for (i = 0; i < length; i ++)
    {
        fputs(new, fc);
    }
}
4

3 に答える 3

1

まず、book1 と book2 の複製がうまく並んでいると思いますか?

book1 の最初のエントリが book2 の最後のエントリと同一であるかどうかを検出する方法を考えてみてください。

次に、出力をアルファベット順に並べ替える必要があります。並べ替えアルゴリズムは、学生が常に行うことを余儀なくされている一般的なことの 1 つです。それはキャラクターを構築します。おまけとして、クイックソートを実装してください。

于 2012-05-09T21:42:00.443 に答える
1

あなたの使い方strcpy()は独特です。その署名を思い出してください。

char *strcpy(char *dest, const char *src)

これは、私にはすぐには意味をなさない使用法です。

strcpy (new, str); // new now has str
strcpy (new, str2); // new now has str2

そこに何かを効果的に上書きしました。私はそこから始めて、あなたが意図したとおりに機能していない可能性があるものを確認します。さらに、 を使用できる場合は、コードのデバッグにも使用することgccを検討してください。(フラグgdbを指定してコンパイルする必要があります。)-g

于 2012-05-09T21:09:47.133 に答える
0

方法をサンプリングします。
エラー処理は省略。
ライブラリ sqort の sort 関数を使用しているので、独自に実装してください。

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

#define LINE_MAX_SIZE 256

typedef struct filePos {
    FILE *fp;
    long pos;
} FilePos;

typedef struct myfile {
    int lines;
    int capacity;
    FILE *fp;
    FilePos *filePoss;
} MyFile;

MyFile *myfopen(const char *filepath){
    char buff[LINE_MAX_SIZE];
    MyFile *mfp;
    mfp = (MyFile*)malloc(sizeof(MyFile));
    mfp->lines = 0;
    mfp->capacity=16;
    mfp->filePoss=NULL;
    mfp->filePoss=(FilePos*)realloc(mfp->filePoss, sizeof(FilePos)*(mfp->capacity *= 2));
    mfp->fp = fopen(filepath, "r");
    do{
        mfp->filePoss[mfp->lines].fp = mfp->fp;
        mfp->filePoss[mfp->lines].pos = ftell(mfp->fp);
        if(++mfp->lines == mfp->capacity){
            mfp->filePoss=(FilePos*)realloc(mfp->filePoss, sizeof(FilePos)*(mfp->capacity *= 2));
        }
    }while(NULL!=fgets(buff, LINE_MAX_SIZE, mfp->fp));
    --mfp->lines;
    return mfp;
}

void myfclose(MyFile *mfp){
    free(mfp->filePoss);
    fclose(mfp->fp);
    free(mfp);
}

char *myfgets(FilePos *p, char *buff){
    fseek(p->fp, p->pos, SEEK_SET);
    return fgets(buff, LINE_MAX_SIZE, p->fp);
}

int myfcomp(const void *a, const void *b){
    char buff_a[LINE_MAX_SIZE];
    char buff_b[LINE_MAX_SIZE];
    FilePos *fpa,*fpb;
    fpa=(FilePos*)a;
    fpb=(FilePos*)b;
    myfgets(fpa, buff_a);
    myfgets(fpb, buff_b);
    return strcmp(buff_a, buff_b);
}

void myfsort(MyFile *mfp){
    qsort(mfp->filePoss, mfp->lines, sizeof(FilePos), myfcomp);
}

void myfprint(MyFile *mfp){
    char buff[LINE_MAX_SIZE];
    int i;

    for(i=0;i<mfp->lines ;++i)
        printf("%s", myfgets(mfp->filePoss + i, buff));
}

void merge(const char *inpfile1, const char *inpfile2, const char *outfile){
    FILE *fo;
    MyFile *fi1, *fi2;
    char buff_f1[LINE_MAX_SIZE];
    char buff_f2[LINE_MAX_SIZE];
    char buff_fo[LINE_MAX_SIZE];
    char *outbuff=NULL;
    int fi1_line, fi2_line;
    int eof1, eof2;

    fo=fopen(outfile, "w");
    fi1=myfopen(inpfile1);
    fi2=myfopen(inpfile2);
    myfsort(fi1);
    myfsort(fi2);
    fi1_line=fi2_line=0;
    eof1=eof2=0;
    *buff_fo='\0';
    while(1){
        if(!eof1 && outbuff != buff_f2){
            myfgets(&(fi1->filePoss[fi1_line]), buff_f1);
        }
        if(!eof2 && outbuff != buff_f1){
            myfgets(&(fi2->filePoss[fi2_line]), buff_f2);
        }
        if(!eof1 && !eof2){
           if(strcmp(buff_f1, buff_f2) <= 0){
                outbuff=buff_f1;
                ++fi1_line;
            } else {
                outbuff=buff_f2;
                ++fi2_line;
            }
        } else if(!eof1 && eof2){
            outbuff=buff_f1;
            ++fi1_line;
        } else if(eof1 && !eof2){
            outbuff=buff_f2;
            ++fi2_line;
        } else {
            break;
        }
        if(strcmp(outbuff, buff_fo) != 0){//duplicate check
            strcpy(buff_fo, outbuff);
            fputs(buff_fo, fo);
        }
        if(fi1->lines == fi1_line)
            eof1 = !0;
        if(fi2->lines == fi2_line)
            eof2 = !0;
    }
    myfclose(fi2);
    myfclose(fi1);
    fclose(fo);
}

int main(){
    merge("book1.txt", "book2.txt", "fixed.txt");
    return 0;
}
于 2012-05-10T17:21:55.953 に答える