2012-05-09 2 views
-1

Я supoosed напишу функцию, которая читает два текстовых файла по строкам, сравнивает их, удаляет дубликаты, а их в третий файл в алфавитном порядке ... Я работаю над это уже более месяца, и я все еще застрял. Я попробовал несколько способов сделать это и не придумал ничего ... Я был сформирован, что мне нужно использовать strcmp для этого, и я не могу использовать любую предопределенную функцию сортировки. .Я также смотрели вокруг на этом сайте и не можете найти много, что помогает с этим ... любая помощь будет в значительной степени будет appreciated..Here то, что я до сих пор:слияние и сортировка текстового файла в C

#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); 
    } 
} 
+0

Что не работает? – thumbmunkeys

+0

Попробуйте вставить свой код. Это помогает визуализировать поток программы. – pmg

+0

Если бы он отступил, это заняло бы его еще месяц. – wildplasser

ответ

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.)

+0

Большое спасибо за ваш ответ ... Я взглянул на это и перезаписал строку, но проблема в том, что если я попробую strcpy (new [i], str) или даже strcpy (new [i], str [i]) он вообще не работает. Я получаю много предупреждений указателя ... – user1385602

+0

@ user1385602: Как я уже сказал, это начало.Существует целый беспорядок ошибок указателя с кодом, но, как я сказал в более раннем комментарии, определить, что каждый блок кода должен делать, и определить, почему он * не делает то, что вы хотите. – Makoto

+0

Благодарим за помощь. – user1385602

1

Прежде всего, можете ли вы предположить, что дубликаты из book1 и book2 выстраиваются в линию?

Подумайте, как определить, будет ли первая запись в книге 1 идентична последней записи в книге2.

Во-вторых, у вас есть сортировать свой выход по алфавиту. Сортировочные алгоритмы - это одна из тех распространенных вещей, которые студенты вынуждены делать все время. Он строит характер. Для бонусных наград, быстро реализуйте сорт.

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; 
} 
Смежные вопросы