Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Porównywanie dwóch plików i wyświetlanie różnic.

spawlak 19 Mar 2007 22:31 2088 4
  • #1 19 Mar 2007 22:31
    spawlak
    Poziom 9  

    Witam,
    otóż mam do napisania program w C w niewielkim stopniu naśladujący linuksowe polecenie diff,a mianowicie program ma pobrać jako parametry wejściowe dwa pliki tekstowe: bazowy (wzór) i drugi do porównania. Następnie powinien wyświetlić różnice, jakie wystąpiły pomiędzy nimi. Napisałem część odpowiedzialną za wskazanie, w których wierszach owe pliki się różnią, ale zastanawiam się, w jaki sposób uwidocznić te różnice - podświetlić w jakiś sposób te linie, zapisać je do innego pliku wraz z numerem wiersza... Proszę o wszelkie propozycje wraz z przykładowym rozwiązaniem (kodem źródłowym). Oto fragment mojego kodu:

    Code:
    //wypisz na ekran linie, ktorymi roznia sie os siebie dwa pliki
    
    //dwa przypadki: plik A jest dluzszy od pliku B i odwrotnie
    //szkic rozwizania

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

    int main(int argc, char *argv[])
    {
      FILE *fp1, *fp2;
      char  linia1[80], linia2[80];
      int line_no = 0;





       while ( !feof(fp1) && !feof(fp2) )
      {
       if ( ( fgets(linia1, 80, fp1) != NULL) && ( fgets(linia2, 80, fp2) != NULL ) )
       {
          ++line_no;
          if ( strcmp(linia1, linia2) != 0 ) // rozne linie, wiec wydrukuj
          printf("Linie %d rozne\n\t Plik %s: %s\t File %s: %s\n",
          line_no, argv[1], linia1, argv[2], linia2);
       }
      }

      if ( feof(fp1) && ! feof(fp2) ) // plik 2 dluzszy wyswietl rezultat koncowy
      {
          printf("\n Plik %s dluzszy niz plik %s: Pozostale linie:\n", argv[2], argv[1]);
          while ( !feof(fp2) )
          if ( fgets(linia, 80, fp2) != NULL) printf("\t%s", linia2);
      }
       else
           if ( feof(fp2) && ! feof(fp1)) // plik 1 dluzszy ,wyswietl rezultat koncowy
           {
              printf("\n Plik dluzszy niz plik %s: :\n", argv[1], argv[2]);
              while (!feof(fp1))
              if ( fgets(linia1, 80, fp1) != NULL) printf("\t%s", linia1);
           }
           getchar();
    return (0);
    }

    0 4
  • #2 21 Mar 2007 09:29
    mf18
    Poziom 12  

    Ja bym to zrobił tak: przesuwanie dwóch wskaźników znak po znkau w obu plikach jednocześnie i porównanie ich wartośi, tam, gdzie by się różniły, zapamiętał bym ich położenie w strukturze i przy wyświetlaniu zapamiętane znaki wyróżnił.

    0
  • #3 21 Mar 2007 12:05
    spawlak
    Poziom 9  

    Widze, że problem przerasta nie tylko mnie... Za konkretne propozycje przewidzina nagroda w postaci punktów :-) Aha, kodzik do skompilowania, aby zobrazować problem ;-)

    Code:

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    int main(int argc, char *argv[])
    {
      FILE *fp1, *fp2;
      char  linia1[80], linia2[80];
      int line_no = 0;


    if (argc!=3)
    {
    printf("Nieprawidlowe uzycie. Prawidlowe wywolaniw programu:\n p1.exe plik1.txt plik2.txt\n");
    getchar();
    return(1);
    }

    fp1=fopen(argv[1],"r");
    fp2=fopen(argv[2],"r");

    while ( !feof(fp1) && !feof(fp2) )
      {
       if ( ( fgets(linia1, 80, fp1) != NULL) && ( fgets(linia2, 80, fp2) != NULL ) )
       {
          ++line_no;
          if ( strcmp(linia1, linia2) != 0 ) // rozne linie, wiec wydrukuj
          printf("Linie %d rozne\n\t Plik %s: %s\t plik %s: %s\n",line_no, argv[1], linia1, argv[2], linia2);
          else printf("W plikach nie wykryto roznic");//jak sa takie same
          //printf(argv[1]); //sprawdzenie
       }
      }
     


      if ( feof(fp1) && ! feof(fp2) ) // plik 2 dluzszy wyswietl rezultat koncowy
      {
          printf("\n Plik %s dluzszy niz plik %s: Pozostale linie:\n", argv[2], argv[1]);
          while ( !feof(fp2) )
          if ( fgets(linia2, 80, fp2) != NULL)
          printf("\t%s", linia2);
      }
       else
           if ( feof(fp2) && ! feof(fp1)) // plik 1 dluzszy ,wyswietl rezultat koncowy
           {
              printf("\n Plik dluzszy niz plik %s: :\n", argv[1], argv[2]);
              while (!feof(fp1))
              if ( fgets(linia1, 80, fp1) != NULL) printf("\t%s", linia1);
           }
           
           getchar();
    return (0);
    }

    0
  • #4 21 Mar 2007 19:00
    Minner
    Poziom 18  

    zależy co w ogólne definiujesz jako różnica plików.
    Gdy jeden plik tekstowy będzie miał zawartość
    " ab c d ef " a drugi "ab c d e f " to co byś chciał, aby ci wyróżniło jako różnice plików?

    0
  • #5 22 Mar 2007 10:27
    spawlak
    Poziom 9  

    W tym przypadku chciałbym, aby podświetliło ta linijke w tekście, w kótrej wystąpiły różnice, czyli dla zawartości pliku bazowego abcd w linii 1 i dla zawartośći pliku do porównania w postaci a b cd, chciałbym, aby linia 1 pliku do porównania została w jakiś sposób wyróżniona, ponieważ dla dużych plików wynik, który generuje w/w kod jest trudny do analizy. Zastanawiałem się nad stworzeniem tabeli na kształt NC, gdzie po prawej znak po znaku będzie 'na żywo' ładowany plik bazowy, a po prawej stronie będzie wypisywana cała linijka wraz z numerem i treścią w przypadku wystąpienia różnicy. Następnie po dojściu do końca ekranu, użytkownik zostałby poproszony o naciśnięcie klawisza w celu kontynuacji, jednocześnie fragment wyniku byłby zapisywany do pliku z wynikiem działania i cała operacja powtarzałaby się do momentu zakończenia całej operacji, oczywiście kolejne 'zrzuty ekranowe' byłyby dopisywane do pliku wynikowego. Chcę do tego użyć funkcji z biblioteki conio2.h, jednakże jestem początkujący, dlatego proszę o wszelkie sugestie i wskazówki.

    0