Advertisement
m4ly

[POLSL][PK][LAB4] XML

May 10th, 2015
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.37 KB | None | 0 0
  1. /*
  2. Xml basic reader
  3. Dawid Mocek
  4. 2014-05
  5.  
  6. Zadanie 2.
  7.  Napisz program, który umożliwia łączenie wielu plików XML z uwzględnieniem podziału informacji na grupy. W pliku wynikowym grupy o tej samej nazwie nie mogą się powtarzać.
  8.  
  9.  
  10. Przykładowy plik wejściowy 1:
  11. <Pogoda>
  12. Niedziela będzie słoneczna.
  13. </Pogoda>
  14. <Wiadomości>
  15. Wybuch na słońcu spowodował awarie w różnych miejscach globu.
  16. </Wiadomości>
  17.  
  18. Przykładowy plik wejściowy 2:
  19. <Akcje>
  20. Dzisiaj hossa na rynku.
  21. </Akcje>
  22. <Pogoda>
  23. Sobota będzie słoneczna, chyba…
  24. </Pogoda>
  25.  
  26. Plik wyjściowy:
  27. <Pogoda>
  28. Niedziela będzie słoneczna.
  29. Sobota będzie słoneczna, chyba…
  30. </Pogoda>
  31. <Wiadomości>
  32. Wybuch na słońcu spowodował awarie w różnych miejscach globu.
  33. </Wiadomości>
  34.  
  35. Przykładowy plik wejściowy 2:
  36. <Akcje>
  37. Dzisiaj hossa na rynku.
  38. </Akcje>
  39.  
  40. */
  41.  
  42.  
  43. #include <stdlib.h>
  44. #include <stdio.h>
  45. #include <string.h>
  46.  
  47. struct node // struktura przechowująca tagi i ich treść
  48. {
  49.     char *tag_nazwa;
  50.     char *tresc;
  51. };
  52.  
  53.  
  54. FILE * otworz_plik(const char *plik, char *tryb) //otwieranie pliku
  55. {
  56.     FILE *fh = fopen(plik, tryb);
  57.     if (fh == NULL)
  58.     {
  59.         perror(" Blad otwarcia pliku");   //jeśli bląd to komunikat
  60.         exit(EXIT_FAILURE);
  61.     }
  62.     return fh;
  63. }
  64.  
  65.  
  66. char *czytaj_do_pamieci(FILE *fh) //funkcja wczytująca dane z pliku do pamięci
  67. {
  68.     char *zawartosc = NULL;
  69.     char  buffer[BUFSIZ]; //512
  70.     size_t buffSize = 0;
  71.     char *tmp = NULL;
  72.     while (fgets(buffer, sizeof(buffer), fh) != NULL)
  73.     {
  74.         tmp = (char*)realloc(zawartosc, (buffSize + strlen(buffer) + 1));
  75.         if (tmp)
  76.         {
  77.             zawartosc = tmp;
  78.         //  printf("zawartosc = %s <=> tmp = %s", zawartosc, tmp);
  79.             zawartosc[buffSize] = '\0';
  80.             strcat(zawartosc, buffer);
  81.             buffSize += strlen(buffer) + 1;
  82.         }
  83.         else
  84.         {
  85.             perror("Blad pamieci\n"); //jeśli bląd to komunikat
  86.             free(zawartosc);
  87.             zawartosc = NULL;
  88.             exit(EXIT_FAILURE);
  89.         }
  90.     }
  91.     return zawartosc;
  92. }
  93.  
  94. void zapisz_do_pliku(FILE *plik, struct node **wezly, int size)  //funkcja zapisująca do pliku zawartość wezlow
  95. {
  96.     int i;
  97.     for (i = 0; i < 1; ++i)
  98.     {
  99.         fprintf(plik,"Tag: %s, Tresc: %s\n", wezly[i]->tag_nazwa, wezly[i]->tresc);
  100.     }
  101. }
  102.  
  103.  
  104. struct node ** analizuj(char *tekst, int *size)  // FUNKCJA ANALIZUJĄCA CIĄG ZNAKÓW I ROZPOZNAJĄCA TAGI
  105. {
  106.     struct node **tablica = NULL;
  107.     int ilosc_nodow = 0;
  108.     *size = 0;
  109.     char *tag_start = tekst;
  110.     while (1) //bedzie ich wiecej
  111.     {
  112.         tag_start = strchr(tag_start, '<'); //tag zaczyna się od tego znaku
  113.         if (tag_start == NULL)
  114.             break;
  115.         char *tag_end = strchr(tag_start, '>');
  116.         int tag_dlugosc = tag_end - tag_start;
  117.         struct node *wezel = (struct node *)malloc(sizeof(struct node)); //tu sie zaczynaja wezly
  118.  
  119.         wezel->tag_nazwa = (char *)malloc(tag_dlugosc * sizeof(char));
  120.         memset(wezel->tag_nazwa, 0, tag_dlugosc);
  121.         memcpy(wezel->tag_nazwa, tag_start + 1, tag_dlugosc - 1);  //sprytna funkcja do wyłuskania tekstu
  122.  
  123.         char *ctag_start = strstr(tag_end, "</");  //tak sie ma zaczynać ctag (konczacy)
  124.         int tresc_dlugosc = ctag_start - tag_end;
  125.         wezel->tresc = (char *)malloc(tresc_dlugosc * sizeof(char));
  126.         memset(wezel->tresc, 0, tresc_dlugosc);
  127.         memcpy(wezel->tresc, tag_end + 1, tresc_dlugosc - 1);
  128.  
  129.         // Szukamy ctag zamykajacego
  130.         char *ctag_end = ctag_start + tag_dlugosc + 1;
  131.         tag_start = ctag_end;
  132.         printf("analyze- tag: %s, tresc: %s\n", wezel->tag_nazwa, wezel->tresc);
  133.         tablica = (struct node **)realloc(tablica, sizeof(struct node *) * ++ilosc_nodow);
  134.         tablica[ilosc_nodow - 1] = wezel;
  135.     }
  136.     *size = ilosc_nodow;
  137.     return tablica;
  138. }
  139.  
  140.  
  141.  
  142. int main(void)
  143. {
  144.  
  145.     const char *plik1 = "C:\\Users\\Admin\\Documents\\xml1.txt";
  146.     const char *plik2 = "C:\\Users\\Admin\\Documents\\xml2.txt";
  147.     const char *plik3 = "C:\\Users\\Admin\\Documents\\xml3.txt";
  148.  
  149.     FILE *fh1 = otworz_plik(plik1, "r");
  150.     FILE *fh2 = otworz_plik(plik2, "r");
  151.     FILE *fh3 = otworz_plik(plik3, "w");
  152.  
  153.     char *zawartosc1 = czytaj_do_pamieci(fh1);
  154.     char *zawartosc2 = czytaj_do_pamieci(fh2);
  155.    
  156.     int tab_ilosc = 0, tmp;
  157.     struct node **tab = NULL;
  158.     // struct node **tab3 = (struct node **)malloc(4 * sizeof(struct node *));
  159.  
  160.     tab = analizuj(zawartosc1,  &tmp);
  161.     tab_ilosc += tmp;
  162.    
  163.     //analizuj(zawartosc2, &tab, &tmp);
  164.     //tab_ilosc += tmp;
  165.     /// for ...
  166.     // tab3[i] = tab1[i];
  167.  
  168.         printf("Tag: %s, Tresc: %s\n", tab[1]->tag_nazwa, tab[1]->tresc);
  169.    
  170.  
  171.     fclose(fh1);
  172.     fclose(fh2);
  173.     fclose(fh3);
  174.  
  175.     return EXIT_SUCCESS;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement