Posted By

robotNinjaFromOuterSpace on 12/05/10


Tagged


Versions (?)

dinamicanRadSDatotekama


 / Published in: C
 

  1. /*
  2. recimo da hočemo čitati podatke iz datoteka čija imena nisu fiksna,
  3. tj. ne zadajemo im imena direktno u kodu nego tražimo korisnika da ih upiše
  4. te onda radimo s datotekama čija je imena korisnik unio.
  5. to bi se napravilo ovako:
  6. */
  7. FILE* dat1;
  8. FILE* dat2;
  9. char imePrveDat[100];
  10. char imeDrugeDat[100];
  11.  
  12. printf("upisi imena datoteka:");
  13. scanf("%s %s", imePrveDat, imeDrugeDat);
  14.  
  15. if( (prva = fopen(imePrveDat, "r")) == 0 ) return 0;
  16. if( (druga = fopen(imeDrugeDat, "r")) == 0 ) return 0;
  17.  
  18. /*
  19. niz znakova (string) deklarira se kao polje znakova (char _ime_ [ _brojElemenata_ ])
  20. premda bi mogli raditi s tim kao poljem znakova, to je dosta komlicirano,
  21. a pošto se koristi često onda je scanf napravljen da prepoznaje stringove.
  22. stringovi se unose sa %s, manje više sva praivla vrijede kao i %d i %d i %c,
  23. samo što se unosi niz znakova. Niz nesmije sadržavati razmak inače će se interpretirati
  24. kao dva niza odvojena razmakom.
  25. ispred imena varijable se NE piše & samo kad se radi sa nizom znakova
  26. (zato što su varijable imePrveDat i imeDrugeDat več pokazivači).
  27. dakle, ako bi htjeli upisati imena dva stringa (imena dvije datoteke) s znakom između njih
  28. napisali bi ovo:
  29. */
  30. FILE* dat1;
  31. FILE* dat2;
  32. char imePrveDat[100];
  33. char imeDrugeDat[100];
  34. char znak;
  35.  
  36. printf("upisi imena datoteka i neki znak:");
  37. scanf("%s %c %s", imePrveDat, &znak, imeDrugeDat);
  38.  
  39. if( (dat1 = fopen(imePrveDat, "r")) == 0 ) return 0;
  40. if( (dat2 = fopen(imeDrugeDat, "r")) == 0 ) return 0;
  41.  
  42. /*
  43. sad ispred varijable znak u scanfu ide & zato žto je to samo jedan znak, a ne niz
  44.  
  45. između 2 %s je razmak, dakle imena datoteka (i znak) če korisnik unjeti odvojene razmakom
  46. npr, ako nakon što bi se program izveo korisnik unio:
  47.  
  48. a.txt + b.txt
  49.  
  50. otvorile bi se datoteke "a.txt" i "b.txt"
  51.  
  52. kada bi korisnik unio:
  53.  
  54. a.txt,+,b.txt
  55.  
  56. program bi pokušao otvoriti datoteku "a.txt,+,b.txt"
  57. što bi vjerojatno rezultiralo greškom.
  58.  
  59.  
  60.  
  61. sada kad imena datoteka nisu fiksna onda možemo prilikom
  62. različitih izvođenja programa otvarati različite datoteke.
  63. recimo da otvaramo datoteku "dat000.txt" te želimo,
  64. ukoliko ta datotka već postoji, otvoriti datoteku "dat001.txt"
  65. te ako ona postoji otvaramo "dat001.txt" itd...
  66.  
  67. onda ime datoteke možemo dinamički odrediti:
  68. */
  69.  
  70. FILE* dat;
  71. char imeDat[100] = "dat000.txt";
  72. int brojDat = 0;
  73.  
  74. while( (dat = fopen(imeDat, "r")) != 0 )//pokušavamo otvoriti za čitanje
  75. {
  76. fclose(dat); //ako smo uspjeli odmah ju zatvorimo
  77. brojDat++; //povečamo brojač imena
  78. imeDat[3] = brojDat/100 +'0'; //izračunamo novo ime
  79. imeDat[4] =(brojDat/10) %10 +'0';
  80. imeDat[5] = brojDat %10 +'0';
  81. }// otvaramo sljedeču datoteku, ako nemožemo znači da ne postoji.
  82.  
  83. //te ju sad možemo mirne duše stvoriti znajuči da nismo ništa izbrisali
  84. if( (dat = fopen(imeDat, "w")) == 0 ) return 0;
  85.  
  86. /*
  87. ime se izračunava tako da se uzimaju pojedine znamenke cjelobrojne vrijdnosti brojDat
  88. te se pretvaraju u slova.
  89.  
  90. ako bi trebali datoteku nazvati npr:
  91.  
  92. datotekaXXXX.txt
  93. 0123456789012345
  94. (obratiti pažnju na kojim mjetima se nalaze brojevi koje mjenjamo)
  95.  
  96. onda bi formula izgledala ovako:
  97. */
  98.  
  99. imeDat[8] = (brojDat/1000)%10 +'0';
  100. imeDat[9] = (brojDat/100) %10 +'0';
  101. imeDat[10] =(brojDat/10) %10 +'0';
  102. imeDat[11] = brojDat %10 +'0';
  103.  
  104. /*
  105. tako možemo paziti da podatci koje želimo zapisati ne pobrišu
  106. nekakve stare datoteke koje več postoje.
  107.  
  108.  
  109.  
  110. recimo da su u datotekama koje čitamo nekakvi brojevi,
  111. s kojima trebmao nešto napraviti ovisno o znaku koji je unesen
  112. recimo da su brojevi zapisani u datoteku s razmakom između njih,
  113. trebali bi ih sljedno čitati iz datoteka koje smo prethodno otvorili
  114. do kraja jedne ili druge datoteke
  115. */
  116.  
  117. FILE* dat1
  118. FILE* dat2
  119. double x, y;
  120.  
  121. //...otvaranje datoteka i unos znaka
  122.  
  123. while( fscanf(dat1, "%lf ", &x) != EOF && fscanf(dat2, "%lf ", &y) != EOF )
  124. {//čitamo broj po broj iz datoteka, do kraja jedne ili druge
  125. switch(znak) //ovisnio o znaku koji je prethono učitan
  126. {// napravi određenu operaciju
  127. case '+': printf("%lf ", x+y); //zbrajanje
  128. break;
  129. case '/': printf("%lf ", x/y); //djeljenje
  130. break;
  131. case '%': printf("%lf ", fmod(x,y)); //modul (math.h)
  132. break;
  133. case '^': printf("%lf ", pow(x,y)); // potencija (math.h)
  134. break;
  135. default: //ako je uneseni znak neki različit od ovih gore onda se ne dogodi ništa
  136. break;
  137. }
  138. }
  139.  
  140. /*
  141. kad bi recimo rezultate operacija htjeli spremiti u neku treču datoteku onda
  142. bi umjesto printf koristili fprintf npr:
  143. */
  144. fprintf(dat3, "%lf ", x/y);
  145. /*
  146. s time da treba datoteku dat3 prethodno otvoriti za pisanje.
  147.  
  148.  
  149. ako treba prebrojati broj operacija, lako se u while doda brojač,
  150. koji se postavi na nula prije svakog ulaza u petlju:
  151. */
  152.  
  153. //...
  154. brojacZapisa = 0;
  155. while( fscanf(prva, "%lf ", &x) != EOF && fscanf(druga, "%lf ", &y) != EOF )
  156. {
  157. brojacZapisa++;
  158. //...
  159.  
  160.  
  161. /*
  162. treba još zapamtiti da se sve datoteke s kojima smo radili na kraju programa i zatovre.
  163. */

Report this snippet  

You need to login to post a comment.