home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2001 December / pcwk12201b.iso / Reklamy / CAD-Projekt / MegaCAD-4_5 / CC / LEKCJA15.C_ / LEKCJA15.C
Text File  |  1995-09-01  |  13KB  |  373 lines

  1. /*                      LEKCJA15.C
  2. //---------------------------------------------------------------------------
  3. Temat:
  4.         OPERACJE NA  PLIKACH
  5. //---------------------------------------------------------------------------
  6. Funkcje:
  7.     Oto lista funkcji (dost⌐pnych programiÿcie) sêu╛Ñcych do obsêugi plików.
  8.     
  9.     EXT(37) short  ML_Open(char *name,ushort mode);
  10.     EXT(38) short  ML_Close(short fh);
  11.     EXT(39) short  ML_Remove(char *name);
  12.     EXT(40) uint   ML_Read(void *buf,uint size,short fh);
  13.     EXT(41) uint   ML_Write(void *buf,uint size,short fh);
  14.     EXT(42) long   ML_Tell(short fh);
  15.     EXT(43) short  ML_Seek(short fh,long offset,short origin);
  16.     EXT(44) short  ML_Printf(short fh,char *fmt,...);
  17.     EXT(45) long   ML_FileLen(short fh);
  18.     EXT(46) void   ML_Flush(short fh);
  19.     EXT(47) void   ML_Rewind(short fh);
  20.     EXT(48) short  ML_Puts(char *str,short fh);
  21.     EXT(49) char * ML_Gets(char *str,ushort max,short FH);
  22.     EXT(50) short  ML_Putc(short fh,short chr);
  23.     EXT(51) short  ML_Getc(short fh);
  24. //---------------------------------------------------------------------------
  25.  
  26. EXT(37) short ML_Open     (     // 
  27.              char *name,        // nazwa pliku
  28.              short mode   );    // opcja 
  29. Opis:
  30.     Funkcja otwiera plik.
  31.     Nazwa pliku powinna zostaå podana wraz z peênÑ nazwÑ ÿcie╛ki dost⌐pu.
  32.     Gdy koΣcowym czêonem jest '.mtl' funkcja sprawdza, czy jest to 
  33.     biblioteka MegaCADa, jeÿli tak otwiera podany plik w bibliotece.
  34.  
  35. Opcje:
  36.     ML_WRITE        - do zapisu
  37.     ML_READ         - do odczytu
  38.     ML_PLUS         - przeêÑcznik '+'
  39.     ML_TEXT         - plik tekstowy
  40.     ML_BIN          - plik binarny
  41.     ML_APPEND       - doêÑczenie
  42.  
  43. Flags (ograniczenia dost⌐pu):
  44.     ML_DENY_NO      - bez ograniczeΣ dost⌐pu
  45.     ML_DENY_RD      - inny program nie ma prawa odczytu
  46.     ML_DENY_WR      - inny program nie ma prawa zapisu 
  47.     ML_DENY_RW      - inny program nie ma prawa odczytu i zapisu
  48.  
  49. Uwaga! W przeciwieΣstwie do standardowych funkcji j⌐zyka 'C' przy pomocy
  50.     funkcji ML_APPEND wska½nik pozycji mo╛na ustawiå co najwy╛ej 1 byte 
  51.     poza koniec pliku.
  52.  
  53. Return:
  54.     numer pliku - w przypadku poprawnego dziaêania
  55.     0 - w przypadku wystÑpienia bê⌐du
  56. //---------------------------------------------------------------------------
  57.  
  58. EXT(38) short ML_Close    (     // 
  59.              short fh     );    // numer pliku
  60.  
  61. Opis:
  62.     Funkcja zamyka plik o numerze 'fh'.
  63.  
  64. Return:
  65.     TRUE  - w przypadku poprawnego dziaêania
  66.     FALSE - w przypadku wystÑpienia bê⌐du
  67. //---------------------------------------------------------------------------
  68.  
  69. EXT(39) short ML_Remove   (     // 
  70.              char *name   ):    // nazwa pliku
  71.  
  72. Opis:
  73.     Funkcja kasuje plik o nazwie 'name'.
  74.  
  75. Return:
  76.     TRUE  - w przypadku poprawnego dziaêania
  77.     FALSE - w przypadku wystÑpienia bê⌐du
  78. //---------------------------------------------------------------------------
  79.  
  80. EXT(40) uint ML_Read      (     // 
  81.              void *buf,         // bufor dla danych
  82.              uint sitze,        // iloÿå przekazanych bytów
  83.              short fh     );    // numer pliku
  84.  
  85. Opis:
  86.     Funkcja wpisuje do bufora iloÿå 'sitze' bytów z pliku o numerze 'fh'.
  87.  
  88. Uwaga!
  89.     Funkcja nie dopisuje dodatkowych bytów, a wi⌐c w przypadku pliku 
  90.     tekstowego nale╛y wczytywany êaΣcuch zakoΣczyå '\0'.
  91.  
  92. Return:
  93.     iloÿå wczytanych bytów.
  94. //---------------------------------------------------------------------------
  95.  
  96. EXT(41) uint ML_Write     (     // 
  97.              void *buf,         // bufor dla danych
  98.              uint sitze,        // iloÿå przekazanych bytów
  99.              short fh     );    // numer pliku
  100.  
  101. Opis:
  102.     Funkcja przepisuje z bufora do pliku o numerze 'fh' iloÿå 'sitze'. 
  103.  
  104. Uwaga!
  105.     Funkcja nie dopisuje dodatkowych bytów, a wi⌐c w przypadku pliku 
  106.     tekstowego nale╛y wczytywany êaΣcuch zakoΣczyå '\0'.
  107.  
  108. Return:
  109.     iloÿå wczytanych bytów.
  110. //---------------------------------------------------------------------------
  111.  
  112. EXT(42) long ML_Tell      (     // 
  113.              short fh     );    // numer pliku
  114.  
  115. Opis:
  116.     Funkcja podaje aktualnÑ pozycj⌐ wska½nika pliku o numerze 'fh'.
  117.  
  118. Return:
  119.     pozycja wska½nika  - w przypadku poprawneg dziaêania
  120.     (0L) - w przypadku wystÑpienia bê⌐du
  121. //---------------------------------------------------------------------------
  122.  
  123. EXT(43) short ML_Seek     (     // 
  124.              short fh,          // numer pliku
  125.              long  offset,      // offset w bytach
  126.              short origin );    // pozycja startowa
  127.  
  128. Opis:
  129.     Funkcja ustawia wska½nik pliku o numerze 'fh' na pozycji 
  130.     'origin'+'offset'.
  131.  
  132.     Wartoÿå 'origin' mo╛e przyjmowaå nast⌐pujÑce wartoÿci:
  133.     SEEK_SET - 'offset' liczony od poczÑtku pliku
  134.     SEEK_CUR - 'offset' liczony od aktualnej pozycji
  135.     SEEK_END - 'offset' liczony od koΣca pliku
  136.  
  137. Uwaga! W przeciwieΣstwie do standardowych funkcji j⌐zyka 'C' przy pomocy
  138.     funkcji ML_Seek wska½nik pozycji mo╛na ustawiå co najwy╛ej 1 byte 
  139.     poza koniec pliku.
  140.  
  141. Return:
  142.     0  - w przypadku poprawneg dziaêania
  143.     !0 - w przypadku wystÑpienia bê⌐du
  144. //---------------------------------------------------------------------------
  145.  
  146. EXT(44) short ML_Printf   (     // 
  147.              short fh,          // numer pliku
  148.              char  *fmt,        // êaΣcuch formatujÑcy
  149.              ,,,,,,,..... );    // zmienne, parametry, teksty itp.
  150.  
  151. Opis:
  152.     Funkcja wpisuje do pliku o numerze 'fh' dane, których format zdefiniowany
  153.     jest w êaΣcuchu 'fmt'. Format ten jest zgodny ze standardem j⌐zyka 'C'
  154.     u╛ywanym w rozkazie 'printf'.
  155.  
  156. Return:
  157.     iloÿå wpisanych znaków
  158. //---------------------------------------------------------------------------
  159.  
  160. EXT(45) long ML_FileLen   (     // 
  161.              short fh     );    // numer pliku
  162.  
  163. Opis:
  164.     Funkcja podaje dêugoÿå pliku o numerze 'fh'.
  165.  
  166. Return:
  167.     dêugoÿå pliku
  168. //---------------------------------------------------------------------------
  169.  
  170. EXT(46) void ML_Flush     (     // 
  171.              short fh     );    // numer pliku
  172.  
  173. Opis:
  174.     Funkcja kasuje zawartoÿå wewn⌐trznego bufora danych pliku o numerze 'fh'.
  175.     Dane te sÑ fizycznie zapisywane na dysku.
  176. //---------------------------------------------------------------------------
  177.  
  178. EXT(47) void ML_Rewind    (     // 
  179.              short fh     );    // numer pliku
  180.  
  181. Opis:
  182.     Funkcja ustawia wska½nik pliku o numerze 'fh' na poczÑtku danych.
  183. //---------------------------------------------------------------------------
  184.  
  185. EXT(48) short ML_Puts     (     // 
  186.              char *buf,         // zapisywany êaΣcuch
  187.              short fh     );    // numer pliku
  188.  
  189. Opis:
  190.     Funkcja przepisuje êaΣcuch znaków z bufora do pliku o numerze 'fh'. 
  191.  
  192. Return:
  193.     iloÿå wpisanych znaków
  194. //---------------------------------------------------------------------------
  195.  
  196. EXT(49) char *ML_Gets     (     // 
  197.              char *buf,         // wczytywany êaΣcuch
  198.              ushort max         // maksymalna iloÿå znaków
  199.              short fh     );    // numer pliku
  200.  
  201. Opis:
  202.     Funkcja przepisuje êaΣcuch znaków z pliku o numerze 'fh' do bufora. 
  203.     Wczytywane sÑ znaki, a╛ do pojawienia si⌐ '\n' lub osiÑgni⌐cia 'max'.
  204.  
  205. Return:
  206.     wska½nik na 'buf'- w przypadku poprawnego dziaêania
  207.     NULL - w przypadku wystÑpienia bê⌐du lub osiÑgni⌐cia koΣca pliku
  208. //---------------------------------------------------------------------------
  209.  
  210. EXT(50) short ML_Putsc    (     // 
  211.              short fh,          // numer pliku
  212.              short chr    );    // zapisywany znak
  213.  
  214. Opis:
  215.     Funkcja wpisuje znak do pliku o numerze 'fh'. 
  216.  
  217. Return:
  218.     wpisany znak - w przypadku poprawnego dziaêania
  219.     EOF - w przypadku wystÑpienia bê⌐du 
  220. //---------------------------------------------------------------------------
  221.  
  222. EXT(51) short ML_Getc     (     // 
  223.              short fh     ):    // numer pliku
  224.  
  225. Opis:
  226.     Funkcja wczytuje znak z pliku o numerze 'fh'. 
  227.  
  228. Return:
  229.     wczytany znak 
  230. */
  231.  
  232.  
  233. //---------------------------------------------------------------------------
  234. #define SEEK_CUR 1
  235. #define SEEK_END 2
  236. #define SEEK_SET 0
  237.  
  238. #include "std.h"
  239. #include "megatyp.h"
  240. #include "megacad.h"
  241. //---------------------------------------------------------------------------
  242. static short PodajInfo(short wynik, short pozycja_startu, short numer_pliku)
  243. {
  244.    long offset;
  245.    char buf1[255];
  246.    if( ! wynik)
  247.    {
  248.       offset = ML_Tell(numer_pliku);
  249.       sprintf(buf1,"offset: %ld pozycja: %d",offset,pozycja_startu);
  250.       Message("ML_Seek OK",buf1,NULL,NULL,"OK",3);
  251.       return(FALSE);
  252.    }
  253.    else
  254.    {
  255.       sprintf(buf1,"offset: %ld pozycja: %d",offset,pozycja_startu);
  256.       Message("ML_Seek bêÑd !",buf1,NULL,NULL,"OK",3);
  257.       ML_Close(numer_pliku);
  258.       return(TRUE);
  259.    }
  260. }
  261. //---------------------------------------------------------------------------
  262. short main(char *filename, char *args)
  263. {
  264.     short numer_pliku, wynik, klawisz;
  265.     long offset, dlugosc;
  266.     char buf[51], buf1[51], buf2[51], nazwa_pliku[50], *pbuf;
  267.  
  268.     // wpisanie do zmiennej 'nazwa_pliku' nazwy obrabianego pliku
  269.     sprintf(nazwa_pliku,"C:\\namtes.txt");
  270.  
  271.     // otwarcie pliku tekstowego do zapisu i odczytu
  272.     numer_pliku = ML_Open(nazwa_pliku,ML_WRITE | ML_PLUS | ML_TEXT);
  273.  
  274.     // pokazanie numeru pliku
  275.     sprintf(buf1,"ML_Open: \"%s\"",nazwa_pliku);
  276.     sprintf(buf2,"plik ten ma numer: %d",numer_pliku);
  277.     Message(buf1,buf2,NULL,NULL,"OK",3);
  278.  
  279.     // wpisanie tekstu do pliku przy u╛yciu ML_Puts 
  280.     strcpy(buf,"Andrzej");
  281.     wynik = ML_Puts(buf,numer_pliku);
  282.     sprintf(buf1,"ML_Puts: \"%s\"",buf);
  283.     sprintf(buf2,"wpisano znaków: %d",wynik);
  284.     Message(buf1,buf2,NULL,NULL,"OK",3);
  285.  
  286.     // znalezienie aktualnego miejsca w pliku: ML_Tell 
  287.     offset = ML_Tell(numer_pliku);
  288.     sprintf(buf2,"aktualne poêo╛enie wska½nika: %ld",offset);
  289.     Message("ML_Tell",buf2,NULL,NULL,"OK",3);
  290.  
  291.     // przewini⌐cie do poczÑtku
  292.     ML_Rewind(numer_pliku);
  293.     offset = ML_Tell(numer_pliku);
  294.     sprintf(buf1,"ustawienie wska½nika na poczÑtek: %ld",offset);
  295.     Message("ML_Rewind",buf1,NULL,NULL,"OK",3);
  296.  
  297.     // powtórne wczytanie tekstu  ML_Gets 
  298.     pbuf = ML_Gets(buf,20,numer_pliku);
  299.     sprintf(buf1,"znaków: %s wska½nik: %s",buf,pbuf);
  300.     Message("ML_Gets",buf1,NULL,NULL,"OK",3);
  301.  
  302.     // ustawienie wska½nika na 2 znaki przed koΣcem pliku
  303.     offset = ML_Tell(numer_pliku);
  304.     sprintf(buf1,"wska½nik przed ML_Seek = %ld",offset);
  305.     Message("ML_Seek",buf1,NULL,NULL,"OK",3);
  306.  
  307.     wynik = ML_Seek(numer_pliku,(-2L),SEEK_END);
  308.     if(PodajInfo(wynik,1,numer_pliku)) return;
  309.  
  310.     // powtórne przejÿcie na koniec
  311.     wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
  312.     if(PodajInfo(wynik,2,numer_pliku)) return;
  313.  
  314.     // dopisanie jednego znaku
  315.     wynik = ML_Putc(numer_pliku,'u');
  316.     sprintf(buf1," wpisano znak: %c",wynik);
  317.     Message("ML_Putc",buf1,NULL,NULL,"OK",3);
  318.  
  319.     // przejÿcie do nowej linii
  320.     wynik = ML_Putc(numer_pliku,'\n');
  321.  
  322.     // wczytanie pierwszego znaku z pliku
  323.     ML_Rewind(numer_pliku);
  324.     wynik = ML_Getc(numer_pliku);
  325.     sprintf(buf1,"PierwszÑ literÑ pliku jest: '%c'",wynik);
  326.     Message("ML_Getc",buf1,NULL,NULL,"OK",3);
  327.  
  328.     // powtórne przejÿcie na koniec
  329.     wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
  330.     if(PodajInfo(wynik,3,numer_pliku)) return;
  331.  
  332.     offset = ML_Tell(numer_pliku);
  333.     // wpisanie tekstu "-CAD po Polsku-" przy u╛yciu ML_Write (15 znaków)
  334.     strcpy(buf,"-CAD po Polsku-");
  335.     wynik = ML_Write(buf,15,numer_pliku);
  336.     sprintf(buf1,"[%s] znaków: [%d]",buf,wynik);
  337.     Message("ML_Write",buf1,NULL,NULL,"OK",3);
  338.  
  339.     // przejÿcie na poczÑtek wpisanego tekstu
  340.     wynik = ML_Seek(numer_pliku,offset,SEEK_SET);
  341.     if(PodajInfo(0,4,numer_pliku)) return;
  342.     // wczytanie 11 znaków
  343.     wynik = ML_Read(buf,11,numer_pliku);
  344.     // dopisanie znaku koΣca êaΣcucha, ML_Read tego nie robi
  345.     buf[wynik] = '\0'; 
  346.     sprintf(buf1,"tekst: [%s] znaków: [%d]",buf,wynik);
  347.     Message("ML_Read",buf1,NULL,NULL,"OK",3);
  348.  
  349.     // powtórne przejÿcie na koniec pliku
  350.     wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
  351.     if(PodajInfo(wynik,5,numer_pliku)) return;
  352.  
  353.     // dopisanie do pliku tekstu informacyjnego (od nowej linii)
  354.     ML_Printf(numer_pliku,"%s : %ld","\naktualna pozycja",
  355.                       ML_Tell(numer_pliku));
  356.  
  357.     // podanie dêugoÿci pliku
  358.     dlugosc= ML_FileLen(numer_pliku);     
  359.     sprintf(buf1,"po wpisaniu plik ma dêugoÿå: [%ld]",dlugosc);
  360.     Message("ML_FileLen",buf1,NULL,NULL,"OK",3);
  361.  
  362.     // zamkni⌐cie pliku
  363.     ML_Close(numer_pliku);
  364.  
  365.     // kasowanie pliku
  366.     sprintf(buf1,"czy skasowaå plik \"%s\" \?\"",nazwa_pliku);
  367.     klawisz= Message("ML_Remove",buf1,"pozostaw",NULL,"kasuj",1);
  368.     if (klawisz==3) ML_Remove(nazwa_pliku);
  369.  
  370.     return(0);
  371. }
  372. //---------------------------------------------------------------------------
  373.