Advertisement
michciu

Untitled

Dec 4th, 2019
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.22 KB | None | 0 0
  1. lab06
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define PLIK_TXT "plik.txt"
  7. #define PLIK_BIN "plik.bin"
  8.  
  9. #define ROZMIAR 20
  10. #define TAB_ROZM 10
  11.  
  12. struct Obraz
  13. {
  14.     int rozmiar;
  15.     float przezroczystosc;
  16.     char nazwa[ROZMIAR];
  17. };
  18.  
  19.  
  20. /* Ta funkcja wyswietla nam biezaca pozycje w pliku */
  21. void _pozycja(FILE* fp)
  22. {
  23.     printf("Biezaca pozycja w pliku: %ld\n", ftell(fp));
  24. }
  25.  
  26. void wyswietlenie_zawartosci_pliku_szesnastkowo(char* nazwa_pliku)
  27. {
  28.     printf("Zawartosc pliku szesnastkowo:\n");
  29.     FILE* file;
  30.     if ((file=fopen(PLIK_TXT, "r"))!=NULL) {
  31.      while(!feof(file))            // Ta petla wyswietla wszystkie znaki od biezacej pozycji do konca pliku
  32.             printf("%02x ", fgetc(file));
  33.     }
  34. }
  35.  
  36.  
  37.  
  38. /* ============================= OBSLUGA PLIKU TEKSTOWEGO =========================== */
  39.  
  40. void zapis_pliku_tekstowego(void)
  41. {
  42.     FILE* ft;
  43.     int i=5;
  44.     char napis[] = "Tekst z tablicy napis\n";
  45.  
  46.     if ((ft=fopen(PLIK_TXT, "w"))!=NULL)    // otwieram plik w trybie zapisu tekstowego; jesli plik istnieje, to jego zawartosc jest tracona. Ta operacja moze sie nie udac - kiedy?
  47.     {
  48.         printf("Utworzono plik tekstowy %s\n", PLIK_TXT);
  49.  
  50.         // Mozemy korzystac z odpowiednika znanej juz funkcji printf - dokladnie w taki sam sposob podajac jako pierwszy argument wskaznik na plik
  51.         fprintf(stdout, "Druga linijka tekstu, zmienna i=%d\n", i++);           // Plikiem moze byc stabdardowe wyjscie (zazwyczaj ekran)
  52.         fprintf(ft, "%d %f %c\n", i++, 3.12345, 'c');                           // Zapisywac mozemy wartosci roznych typow
  53.         fprintf(ft, "Druga linijka tekstu, zmienna i=%d, nazwa pliku=%s\n", i++, PLIK_TXT);   // Plikiem moze byc otwarty wczesniej plik dyskowy
  54.  
  55.         fputs(napis, ft);           // Tak tez mozemy zapisac do pliku lancuch znakow
  56.         fputc(napis[1], ft);        // Ta funkcja zapisuje jeden znak
  57.         fputc('\n', ft);            // Znak mozna podac wprost
  58.  
  59.         for(i='a'; i<='z'; i++)     // Wypisujemy caly alfabet do pliku
  60.             fputc(i, ft);
  61.         fputc('\n', ft);            // Nowa linia
  62.  
  63.         fclose(ft);
  64.     }
  65.     else
  66.     {
  67.         printf("Plik nie zostal utworzony plik %s.\n", PLIK_TXT);
  68.     }
  69. }
  70.  
  71.  
  72.  
  73. void odczyt_pliku_tekstowego(void)
  74. {
  75.     FILE* fu;
  76.     int i;
  77.     float j;
  78.     char c;
  79.     char tablica[100];
  80.  
  81.     if ((fu=fopen(PLIK_TXT, "r"))!=NULL)    // Probuje otworzyc plik w trybie tekstowym do odczytu - ta operacja moze sie nie udac. Kiedy?
  82.     {
  83.         fprintf(stdout, "Otwarto plik %s w trybie odczytu tekstowego.\n", PLIK_TXT);  // W taki sposob rowniez mozna wyswietlac informacje w konsoli
  84.         _pozycja(fu);
  85.  
  86.         fscanf(fu, "%d %f %c", &i, &j, &c);     // Za pomoca fscanf mozna wczytywac i od razu parsowac wartosci z pliku - analogicznie jak za pomoca funkcji scanf()
  87.         printf("Wczytalem wartosci z pliku: i=%d j=%f c=%c\n", i, j, c);
  88.         _pozycja(fu);
  89.  
  90.         c = fgetc(fu);      // Wczytuje z pliku jeden znak - Sprawdzic w debugerze, co to jest za znak!
  91.         _pozycja(fu);
  92.  
  93.         fgets(tablica, sizeof(tablica), fu);    // Wczytanie z pliku pelnej linijki tekstu do wskazanej tablicy, ale nie wiecej niz podana liczba znakow
  94.                                                 // sizeof(tablica) - to nas zabezpiecza przed przekroczeniem tablicy
  95.         printf("Wczytalem linijke z pliku: %s", tablica);   // Wczytany lancuch juz zawiera znak konca wiersza
  96.  
  97.         c = fgetc(fu);
  98.         printf("Wczytalem znak z pliku: %c\n", c);
  99.  
  100.         // Sprawdzmy, na ktorej pozycji w pliku znajdujemy sie teraz:
  101.         _pozycja(fu);
  102.         rewind(fu);     // Przesuwamy wskaznik na poczatek pliku
  103.         _pozycja(fu);
  104.  
  105.         fseek(fu, 0, SEEK_END);     // Przesuwam wskaznik na koniec pliku
  106.         _pozycja(fu);               // Biezaca pozycja wskazuje nam przy okazji na rozmiar pliku w bajtach
  107.  
  108.         fseek(fu, -20, SEEK_END);   // Przesuwam wskaznik na 20 znak od konca pliku
  109.         while(!feof(fu))            // Ta petla wyswietla wszystkie znaki od biezacej pozycji do konca pliku
  110.             printf("%c", fgetc(fu));
  111.  
  112.         fclose(fu);
  113.     }
  114.     else
  115.     {
  116.         printf("Nie moge odczytac pliku %s!\n", PLIK_TXT);
  117.     }
  118. }
  119.  
  120.  
  121.  
  122. /* ============================= OBSLUGA PLIKU BINARNEGO =========================== */
  123.  
  124. void zapis_pliku_binarnego(void)
  125. {
  126.     char c='a';
  127.     int i=5;
  128.     float f=3.12345;
  129.     FILE* fb;
  130.     struct Obraz obr;
  131.     struct Obraz tablica[] = {
  132.         { -5, 1.0, "samolot.jpg"},
  133.         { 0, 0.4, "kot.jpg"},
  134.         { 2, 0.7, "pilka.jpg"},
  135.         { 64, 0.123456, "kanapka.jpg"},
  136.         { 123, 0.0, "browar.jpg"},
  137.     };
  138.  
  139.     if ((fb=fopen(PLIK_BIN, "wb"))!=NULL)
  140.     {
  141.         printf("Utworzono plik binarny %s\n", PLIK_BIN);
  142.  
  143.         // W pliku binarnym mozna przechowywac wartosci dowolnych typow, w dowolnej kolejnosci - wazne, aby pozniej podczas wczytywac dane dokladnie w tej samej kolejnosci!
  144.  
  145.         fputc(c, fb);   // Zapis jednego bajta do pliku
  146.         fputc(97, fb);  // To robimy to samo, ale wartosc bajta podana jest "na sztywno"
  147.         fwrite(&c, sizeof(c), 1, fb);   // Zapisuje do pliku fb spod adresu &c jeden element o rozmiarze sizeof(c) - czyli jeden bajt
  148.  
  149.         fwrite(&i, sizeof(i), 1, fb);   // Zapisuje do pliku fb zawartosc zmiennej i
  150.         //UWAGA: funkcja fwrite() zapisuje binarna reprezentacje danych a nie lancuch znakow
  151.  
  152.         fwrite(&f, sizeof(f), 1, fb);   // Zapisuje do pliku fb zawartosc zmiennej f
  153.  
  154.         // Plik binarny bardzo dobrze nadaje sie do przechowywania danych umieszczonych w strukturach
  155.         strcpy(obr.nazwa, "pierwszy.jpg");
  156.         obr.przezroczystosc = 1.0;
  157.         obr.rozmiar = 512;
  158.         fwrite(&obr, sizeof(obr), 1, fb);
  159.  
  160.         //fwrite(tablica, sizeof(tablica), 1, fb);          // Tak zapisujemy zawartosci calej tablicy struktur do pliku
  161.         fwrite(tablica, sizeof(struct Obraz), sizeof(tablica)/sizeof(struct Obraz), fb);    // Tak tez zapisujemy zawartosc calej tablicy, ale elegancko :)
  162.  
  163.         fclose(fb);     // Nalezy zamknac plik po zakonczonej pracy
  164.     }
  165.     else
  166.     {
  167.         printf("Nie moge zapisac pliku %s\n", PLIK_BIN);
  168.     }
  169. }
  170.  
  171.  
  172.  
  173. void odczyt_pliku_binarnego()
  174. {
  175.     unsigned char c;
  176.     int i, j;
  177.     float f;
  178.     FILE* fc;
  179.     struct Obraz tablica[TAB_ROZM];
  180.  
  181.     if ((fc=fopen(PLIK_BIN, "rb"))!=NULL)
  182.     {
  183.         printf("Otwarto plik %s w trybie odczytu binarnego.\n", PLIK_BIN);
  184.         _pozycja(fc);
  185.  
  186.         c=fgetc(fc);    // Wczytuje jeden bajt z pliku
  187.         printf("Wczytalem 1 bajt, dziesietnie=%d szesnastkowo=%02x znak=%c", c, c, c);
  188.  
  189.         c='x';  // kasuje poprzednia wartosc - dla jasnosci sytuacji
  190.         fread(&c, sizeof(char), 1, fc);     // Wczytuje z pliku jeden bajt
  191.         printf("Wczytalem znak: %c\n",c);
  192.         _pozycja(fc);
  193.  
  194.         fseek(fc, 3, SEEK_SET);     // Ustawiam wskaznik na trzeci bajt w pliku - ten, od ktorego zaczyna sie liczba integer
  195.         _pozycja(fc);
  196.  
  197.         fread(&i, sizeof(int), 1, fc);      // Wczytuje liczbe calkowita. Sprawdzic, co sie stanie, jesli miejscami zamieniona zostanie linijka ta z nastepna
  198.         fread(&f, sizeof(float), 1, fc);
  199.         printf("Wczytalem wartosci: i=%d, f=%f\n", i, f);
  200.         _pozycja(fc);
  201.  
  202.         // Struktury wczytuje sie bardzo latwo
  203.         i=0;
  204.         while(!feof(fc) && i<TAB_ROZM)      // wczyujemy po jednej strukturze z pliku do tablicy az do: konca pliku LUB konca miejsca w tablicy (w zaleznosci od tego, co wystapi wczesniej)
  205.             fread(&tablica[i++], sizeof(struct Obraz), 1, fc);
  206.         _pozycja(fc);
  207.  
  208.         // Wyswietlam zawartosc tablicy
  209.         i--;
  210.         while(i-->0)
  211.             printf("[%d] %s rozmiar=%d przezr=%f\n", i, tablica[i].nazwa, tablica[i].rozmiar, tablica[i].przezroczystosc);
  212.     }
  213.     else
  214.     {
  215.         printf("Nie moge otworzyc pliku %s\n", PLIK_BIN);
  216.     }
  217. }
  218.  
  219.  
  220.  
  221. int main()
  222. {
  223.     printf("---------- PLIK TEKSTOWY ----------\n");
  224.  
  225.     zapis_pliku_tekstowego();
  226.     odczyt_pliku_tekstowego();
  227.  
  228.     printf("---------- PLIK BINARNY -----------\n");
  229.  
  230.     zapis_pliku_binarnego();
  231.     odczyt_pliku_binarnego();
  232.  
  233.     wyswietlenie_zawartosci_pliku_szesnastkowo(PLIK_TXT);
  234.     wyswietlenie_zawartosci_pliku_szesnastkowo(PLIK_BIN);
  235.  
  236.     return 0;
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement