-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 中的最后一个条目相同。

其次,您必须按字母顺序对输出进行排序。排序算法是学生一直被迫做的常见事情之一。它塑造性格。对于奖励荣誉,实施快速排序

于 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 的排序功能,请实现您自己的。

#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 回答