Advertisement
Guest User

Untitled

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