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
Wrap
Text File
|
1995-09-01
|
13KB
|
373 lines
/* LEKCJA15.C
//---------------------------------------------------------------------------
Temat:
OPERACJE NA PLIKACH
//---------------------------------------------------------------------------
Funkcje:
Oto lista funkcji (dost⌐pnych programiÿcie) sêu╛Ñcych do obsêugi plików.
EXT(37) short ML_Open(char *name,ushort mode);
EXT(38) short ML_Close(short fh);
EXT(39) short ML_Remove(char *name);
EXT(40) uint ML_Read(void *buf,uint size,short fh);
EXT(41) uint ML_Write(void *buf,uint size,short fh);
EXT(42) long ML_Tell(short fh);
EXT(43) short ML_Seek(short fh,long offset,short origin);
EXT(44) short ML_Printf(short fh,char *fmt,...);
EXT(45) long ML_FileLen(short fh);
EXT(46) void ML_Flush(short fh);
EXT(47) void ML_Rewind(short fh);
EXT(48) short ML_Puts(char *str,short fh);
EXT(49) char * ML_Gets(char *str,ushort max,short FH);
EXT(50) short ML_Putc(short fh,short chr);
EXT(51) short ML_Getc(short fh);
//---------------------------------------------------------------------------
EXT(37) short ML_Open ( //
char *name, // nazwa pliku
short mode ); // opcja
Opis:
Funkcja otwiera plik.
Nazwa pliku powinna zostaå podana wraz z peênÑ nazwÑ ÿcie╛ki dost⌐pu.
Gdy koΣcowym czêonem jest '.mtl' funkcja sprawdza, czy jest to
biblioteka MegaCADa, jeÿli tak otwiera podany plik w bibliotece.
Opcje:
ML_WRITE - do zapisu
ML_READ - do odczytu
ML_PLUS - przeêÑcznik '+'
ML_TEXT - plik tekstowy
ML_BIN - plik binarny
ML_APPEND - doêÑczenie
Flags (ograniczenia dost⌐pu):
ML_DENY_NO - bez ograniczeΣ dost⌐pu
ML_DENY_RD - inny program nie ma prawa odczytu
ML_DENY_WR - inny program nie ma prawa zapisu
ML_DENY_RW - inny program nie ma prawa odczytu i zapisu
Uwaga! W przeciwieΣstwie do standardowych funkcji j⌐zyka 'C' przy pomocy
funkcji ML_APPEND wska½nik pozycji mo╛na ustawiå co najwy╛ej 1 byte
poza koniec pliku.
Return:
numer pliku - w przypadku poprawnego dziaêania
0 - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(38) short ML_Close ( //
short fh ); // numer pliku
Opis:
Funkcja zamyka plik o numerze 'fh'.
Return:
TRUE - w przypadku poprawnego dziaêania
FALSE - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(39) short ML_Remove ( //
char *name ): // nazwa pliku
Opis:
Funkcja kasuje plik o nazwie 'name'.
Return:
TRUE - w przypadku poprawnego dziaêania
FALSE - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(40) uint ML_Read ( //
void *buf, // bufor dla danych
uint sitze, // iloÿå przekazanych bytów
short fh ); // numer pliku
Opis:
Funkcja wpisuje do bufora iloÿå 'sitze' bytów z pliku o numerze 'fh'.
Uwaga!
Funkcja nie dopisuje dodatkowych bytów, a wi⌐c w przypadku pliku
tekstowego nale╛y wczytywany êaΣcuch zakoΣczyå '\0'.
Return:
iloÿå wczytanych bytów.
//---------------------------------------------------------------------------
EXT(41) uint ML_Write ( //
void *buf, // bufor dla danych
uint sitze, // iloÿå przekazanych bytów
short fh ); // numer pliku
Opis:
Funkcja przepisuje z bufora do pliku o numerze 'fh' iloÿå 'sitze'.
Uwaga!
Funkcja nie dopisuje dodatkowych bytów, a wi⌐c w przypadku pliku
tekstowego nale╛y wczytywany êaΣcuch zakoΣczyå '\0'.
Return:
iloÿå wczytanych bytów.
//---------------------------------------------------------------------------
EXT(42) long ML_Tell ( //
short fh ); // numer pliku
Opis:
Funkcja podaje aktualnÑ pozycj⌐ wska½nika pliku o numerze 'fh'.
Return:
pozycja wska½nika - w przypadku poprawneg dziaêania
(0L) - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(43) short ML_Seek ( //
short fh, // numer pliku
long offset, // offset w bytach
short origin ); // pozycja startowa
Opis:
Funkcja ustawia wska½nik pliku o numerze 'fh' na pozycji
'origin'+'offset'.
Wartoÿå 'origin' mo╛e przyjmowaå nast⌐pujÑce wartoÿci:
SEEK_SET - 'offset' liczony od poczÑtku pliku
SEEK_CUR - 'offset' liczony od aktualnej pozycji
SEEK_END - 'offset' liczony od koΣca pliku
Uwaga! W przeciwieΣstwie do standardowych funkcji j⌐zyka 'C' przy pomocy
funkcji ML_Seek wska½nik pozycji mo╛na ustawiå co najwy╛ej 1 byte
poza koniec pliku.
Return:
0 - w przypadku poprawneg dziaêania
!0 - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(44) short ML_Printf ( //
short fh, // numer pliku
char *fmt, // êaΣcuch formatujÑcy
,,,,,,,..... ); // zmienne, parametry, teksty itp.
Opis:
Funkcja wpisuje do pliku o numerze 'fh' dane, których format zdefiniowany
jest w êaΣcuchu 'fmt'. Format ten jest zgodny ze standardem j⌐zyka 'C'
u╛ywanym w rozkazie 'printf'.
Return:
iloÿå wpisanych znaków
//---------------------------------------------------------------------------
EXT(45) long ML_FileLen ( //
short fh ); // numer pliku
Opis:
Funkcja podaje dêugoÿå pliku o numerze 'fh'.
Return:
dêugoÿå pliku
//---------------------------------------------------------------------------
EXT(46) void ML_Flush ( //
short fh ); // numer pliku
Opis:
Funkcja kasuje zawartoÿå wewn⌐trznego bufora danych pliku o numerze 'fh'.
Dane te sÑ fizycznie zapisywane na dysku.
//---------------------------------------------------------------------------
EXT(47) void ML_Rewind ( //
short fh ); // numer pliku
Opis:
Funkcja ustawia wska½nik pliku o numerze 'fh' na poczÑtku danych.
//---------------------------------------------------------------------------
EXT(48) short ML_Puts ( //
char *buf, // zapisywany êaΣcuch
short fh ); // numer pliku
Opis:
Funkcja przepisuje êaΣcuch znaków z bufora do pliku o numerze 'fh'.
Return:
iloÿå wpisanych znaków
//---------------------------------------------------------------------------
EXT(49) char *ML_Gets ( //
char *buf, // wczytywany êaΣcuch
ushort max // maksymalna iloÿå znaków
short fh ); // numer pliku
Opis:
Funkcja przepisuje êaΣcuch znaków z pliku o numerze 'fh' do bufora.
Wczytywane sÑ znaki, a╛ do pojawienia si⌐ '\n' lub osiÑgni⌐cia 'max'.
Return:
wska½nik na 'buf'- w przypadku poprawnego dziaêania
NULL - w przypadku wystÑpienia bê⌐du lub osiÑgni⌐cia koΣca pliku
//---------------------------------------------------------------------------
EXT(50) short ML_Putsc ( //
short fh, // numer pliku
short chr ); // zapisywany znak
Opis:
Funkcja wpisuje znak do pliku o numerze 'fh'.
Return:
wpisany znak - w przypadku poprawnego dziaêania
EOF - w przypadku wystÑpienia bê⌐du
//---------------------------------------------------------------------------
EXT(51) short ML_Getc ( //
short fh ): // numer pliku
Opis:
Funkcja wczytuje znak z pliku o numerze 'fh'.
Return:
wczytany znak
*/
//---------------------------------------------------------------------------
#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 0
#include "std.h"
#include "megatyp.h"
#include "megacad.h"
//---------------------------------------------------------------------------
static short PodajInfo(short wynik, short pozycja_startu, short numer_pliku)
{
long offset;
char buf1[255];
if( ! wynik)
{
offset = ML_Tell(numer_pliku);
sprintf(buf1,"offset: %ld pozycja: %d",offset,pozycja_startu);
Message("ML_Seek OK",buf1,NULL,NULL,"OK",3);
return(FALSE);
}
else
{
sprintf(buf1,"offset: %ld pozycja: %d",offset,pozycja_startu);
Message("ML_Seek bêÑd !",buf1,NULL,NULL,"OK",3);
ML_Close(numer_pliku);
return(TRUE);
}
}
//---------------------------------------------------------------------------
short main(char *filename, char *args)
{
short numer_pliku, wynik, klawisz;
long offset, dlugosc;
char buf[51], buf1[51], buf2[51], nazwa_pliku[50], *pbuf;
// wpisanie do zmiennej 'nazwa_pliku' nazwy obrabianego pliku
sprintf(nazwa_pliku,"C:\\namtes.txt");
// otwarcie pliku tekstowego do zapisu i odczytu
numer_pliku = ML_Open(nazwa_pliku,ML_WRITE | ML_PLUS | ML_TEXT);
// pokazanie numeru pliku
sprintf(buf1,"ML_Open: \"%s\"",nazwa_pliku);
sprintf(buf2,"plik ten ma numer: %d",numer_pliku);
Message(buf1,buf2,NULL,NULL,"OK",3);
// wpisanie tekstu do pliku przy u╛yciu ML_Puts
strcpy(buf,"Andrzej");
wynik = ML_Puts(buf,numer_pliku);
sprintf(buf1,"ML_Puts: \"%s\"",buf);
sprintf(buf2,"wpisano znaków: %d",wynik);
Message(buf1,buf2,NULL,NULL,"OK",3);
// znalezienie aktualnego miejsca w pliku: ML_Tell
offset = ML_Tell(numer_pliku);
sprintf(buf2,"aktualne poêo╛enie wska½nika: %ld",offset);
Message("ML_Tell",buf2,NULL,NULL,"OK",3);
// przewini⌐cie do poczÑtku
ML_Rewind(numer_pliku);
offset = ML_Tell(numer_pliku);
sprintf(buf1,"ustawienie wska½nika na poczÑtek: %ld",offset);
Message("ML_Rewind",buf1,NULL,NULL,"OK",3);
// powtórne wczytanie tekstu ML_Gets
pbuf = ML_Gets(buf,20,numer_pliku);
sprintf(buf1,"znaków: %s wska½nik: %s",buf,pbuf);
Message("ML_Gets",buf1,NULL,NULL,"OK",3);
// ustawienie wska½nika na 2 znaki przed koΣcem pliku
offset = ML_Tell(numer_pliku);
sprintf(buf1,"wska½nik przed ML_Seek = %ld",offset);
Message("ML_Seek",buf1,NULL,NULL,"OK",3);
wynik = ML_Seek(numer_pliku,(-2L),SEEK_END);
if(PodajInfo(wynik,1,numer_pliku)) return;
// powtórne przejÿcie na koniec
wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
if(PodajInfo(wynik,2,numer_pliku)) return;
// dopisanie jednego znaku
wynik = ML_Putc(numer_pliku,'u');
sprintf(buf1," wpisano znak: %c",wynik);
Message("ML_Putc",buf1,NULL,NULL,"OK",3);
// przejÿcie do nowej linii
wynik = ML_Putc(numer_pliku,'\n');
// wczytanie pierwszego znaku z pliku
ML_Rewind(numer_pliku);
wynik = ML_Getc(numer_pliku);
sprintf(buf1,"PierwszÑ literÑ pliku jest: '%c'",wynik);
Message("ML_Getc",buf1,NULL,NULL,"OK",3);
// powtórne przejÿcie na koniec
wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
if(PodajInfo(wynik,3,numer_pliku)) return;
offset = ML_Tell(numer_pliku);
// wpisanie tekstu "-CAD po Polsku-" przy u╛yciu ML_Write (15 znaków)
strcpy(buf,"-CAD po Polsku-");
wynik = ML_Write(buf,15,numer_pliku);
sprintf(buf1,"[%s] znaków: [%d]",buf,wynik);
Message("ML_Write",buf1,NULL,NULL,"OK",3);
// przejÿcie na poczÑtek wpisanego tekstu
wynik = ML_Seek(numer_pliku,offset,SEEK_SET);
if(PodajInfo(0,4,numer_pliku)) return;
// wczytanie 11 znaków
wynik = ML_Read(buf,11,numer_pliku);
// dopisanie znaku koΣca êaΣcucha, ML_Read tego nie robi
buf[wynik] = '\0';
sprintf(buf1,"tekst: [%s] znaków: [%d]",buf,wynik);
Message("ML_Read",buf1,NULL,NULL,"OK",3);
// powtórne przejÿcie na koniec pliku
wynik = ML_Seek(numer_pliku,(0L),SEEK_END);
if(PodajInfo(wynik,5,numer_pliku)) return;
// dopisanie do pliku tekstu informacyjnego (od nowej linii)
ML_Printf(numer_pliku,"%s : %ld","\naktualna pozycja",
ML_Tell(numer_pliku));
// podanie dêugoÿci pliku
dlugosc= ML_FileLen(numer_pliku);
sprintf(buf1,"po wpisaniu plik ma dêugoÿå: [%ld]",dlugosc);
Message("ML_FileLen",buf1,NULL,NULL,"OK",3);
// zamkni⌐cie pliku
ML_Close(numer_pliku);
// kasowanie pliku
sprintf(buf1,"czy skasowaå plik \"%s\" \?\"",nazwa_pliku);
klawisz= Message("ML_Remove",buf1,"pozostaw",NULL,"kasuj",1);
if (klawisz==3) ML_Remove(nazwa_pliku);
return(0);
}
//---------------------------------------------------------------------------