LEKCJA 19: KILKA INNYCH PRZYDATNYCH FUNKCJI. ________________________________________________________________ W trakcie tej lekcji dowiesz si�, jak zapisa� teksty na dysku i jak jeszcze mo�na nimi manipulowa� przy pomocy gotowych funkcji Borland C++. ________________________________________________________________ Program poni�ej demonstruje zastosowanie trzech przydatnych funkcji: [P072.CPP] #include <conio.h> int main(void) { int i, x = 0, y = 0; clrscr(); for (i = 1; i < 10; i++) { y = i; x = 5*i; textbackground(16-i); textcolor(i); gotoxy(x, y); cprintf("Wspolrzedne: x=%d y=%d", x, y); getch(); } return 0; } textbackground() - ustaw kolor t�a pod tekstem texcolor() - ustaw kolor tekstu gotoxy() - rozpocznij drukowanie tekstu od punktu o wsp�rz�dnych ekranowych x - numer kolumny (w normalnym trybie: 1-80) y - numer wiersza (w normalnym trybie: 1-25) [Z] ________________________________________________________________ 1. Rozmie�� na ekranie napisy i znaki semigraficzne tworz�ce rysunek tabelki. 2. Opracuj program, w kt�rym pojedyncze znaki, b�d� napisy b�d� porusza� si� po ekranie. 3. Spr�buj przyspieszy� dzia�anie swojego programu z poprzedniego zadania poprzez wstawk� w assemblerze. ________________________________________________________________ OPERACJE PLIKOWE - NIEOBIEKTOWO. W systemia DOS dane i programy s� zgrupowane w pliki. Pliki (ang. file) mog� by� TEKSTOWE i BINARNE. Najcz�stszymi operacjami na plikach s�: * Utworzenie nowego pliku (ang. CREATE); * Odczyt z pliku (ang. READ); * Zapis do pliku (WRITE); * Otwarcie pliku (OPEN); * Zamkni�cie pliku (CLOSE); * Wyszukanie danej w pliku (SEEK); W kontaktach z urz�dzeniami - np. z dyskiem po�rednicz� DOS i BIOS. To system DOS wie, gdzie na dysku szuka� pliku (katalogu) o podanej nazwie i w kt�rych sektorach dysku znajduj� si� fizycznie dane nale��ce do danego pliku. Operacje z plikami opieraj� si� o odwo�ywanie do systemu operacyjnego za po�rednictwem tzw. Deskryptora pliku (File Descriptor - numer identyfikacyjny pliku). Zestaw "narz�dzi" potrzebnych nam do pracy to: IO.H - prototypy funkcji obs�ugi WEj�cia/WYj�cia (ang. Input/Output=IO); FCNTL.H - plik zawieraj�cy definicje wymienionych poni�ej sta�ych: O_BINARY - otwarcie pliku w trybie binarnym; O_TEXT - otwarcie pliku w trybie tekstowym; O_RDONLY (Open for Read Only) - otw�rz tylko do odczytu; O_WRONLY (...Write Only) - tylko dla zapisu; O_RDWR (Reading and Writing) dozwolony zapis i odczyt; STAT.H - zawiera definicje sta�ych S_IREAD - plik tylko do odczytu (przydatne dla funkcji creat); S_IWRITE - tylko zapis (przydatne dla funkcji creat); FUNKCJE: int open(p1, p2, p3) - tr�jparametrowa funkcja otwieraj�ca plik; (parametry patrz przyk�ad) zwraca do programu Wynik = -1 (operacja zako�czona niepowodzeniem - np. nie ma pliku) lub Wynik = File Descriptor - numer pliku przekazany przez DOS. int creat(p1, p2) - funkcja tworz�ca nowy plik; int read(...) - funkcja czytaj�ca z pliku; int write(...) - funkcja zapisu do pliku; imt close(...) - zamkni�cie pliku. Po uruchomieniu program otwiera automatycznie trzy standardowe pliki, zwi�zane z urz�dzeniami: 0 - stdin - standardowy plik wej�ciowy (norm. klawiatura konsoli); 1 - stdout - standardowy plik wyj�ciowy (norm. monitor); 2 - stderr - standardowy plik wyj�ciowy - diagnostyczny (komunikaty o b��dach). [S] STD... STandarD INput - standardowe wej�cie. STD OUTput - standardowe wyj�cie. STD ERRors - plik diagnostyczny. //[P072-2.CPP] # include <stdio.h> # include <conio.h> # include <SYS\STAT.H> //Duze litery tylko dla podkreslenia # include <FCNTL.H> # include <IO.H> char *POINTER; int IL_znakow, DLUG_pliku, TRYB_dostepu, Wynik, i; int Plik_1, Plik_2; char BUFOR[20] = {"TEKST DO PLIKU"}; char STOS[3], ZNAK='X'; main() { POINTER = &BUFOR[0]; printf("Wloz dyskietke do A: i nacisnij cos...\n"); Plik_1 = creat( "a:\\plik1.dat", S_IWRITE); if (Plik_1 == -1) printf("\n Nie udalo sie zalozyc plik1.dat..."); Plik_2 = creat( "a:\\plik_2.dat", S_IWRITE); if (Plik_2 == -1) printf("\n Klops przy Plik2.dat"); _fmode = O_BINARY; //Bedziemy otwierac w trybie binarnym Wynik = open( "a:\\plik1.dat", O_WRONLY ); if (Wynik == -1) printf("\n Nie udalo sie otworzyc pliku..."); IL_znakow = 15; //Ilosc znakow do zapisu Wynik =write( Plik_1, POINTER, IL_znakow ); printf("Zapisalem %d znakow do pliku.", Wynik); close( Plik_1 ); Plik_1 = open("a:\\Plik1.dat", O_RDONLY ); Plik_2 = open("a:\\Plik_2.dat", O_WRONLY ); POINTER = &STOS[0]; for (i=1; ZNAK; i++) //Kopiuje plik + spacje { STOS[1] = ZNAK; write( Plik_2, POINTER, 2); read( Plik_1, &ZNAK, 1); } close(Plik_1); close(Plik_2); getch(); return 0; } Przyk�adowy program wykonuje nast�puj�ce czynno�ci: 1. Tworzy plik a:\plik1.dat (potrzebny dost�p do dyskietki a:). 2. Tworzy plik a:\plik_2.dat. 3. Otwiera plik a:\plik1.dat w trybie binarnym tylko do zapisu. (ZWR�� UWAG�, �e tryb binarny nie przeszkadza zapisa� tekstu.) 4. Dokonuje zapisu do pliku. 5. Zamyka plik a:\plik1.dat. 6. Otwiera plik1.dat w trybie binarnym tylko do odczytu. 7. Otwiera plik_2.dat tylko do zapisu. 8. Kopiuje plik1.dat do plik_2.dat dodaj�c spacje. Zwr�� uwag� na konstrukcj�: for(i=1; ZNAK; i++) Wyja�nienie. P�ki jest znak wykonuj kopiowanie. Przypominam, �e koniec to NUL - '\0'. Je�li czytamy i piszemy po kolei - wszystko jest proste. Je�eli natomiast chcemy wyszuka� w pliku okre�lone miejsce, to b�dzie nam jeszcze dodatkowo potrzebny mechanizm do okre�lenia pozycji w pliku - tzw. WSKA�NIK PLIKOWY. Pozycj� mo�na okre�la� wzgl�dem pocz�tku pliku: SEEK_SET - sta�a okre�laj�ca pozycjonowanie wzgl�dem pocz�tku pliku; SEEK_CUR - wzgl�dem po�o�enia bie��cego (ang. Current - bie��cy); SEEK_END - okre�lenie pozycji wzgl�dem ko�ca pliku; EOF - End Of File - znak ko�ca pliku. Funkcja lseek(): WSK_PLK = long int lseek( plik, o_ile, kierunek); s�u�y do pozycjonowania w pliku. Liczba typu long int okre�laj�ca pozycj� w pliku nazywana jest WSKA�NIKIEM PLIKOWYM ( w programie przyk�adowym zosta�a oznaczona long int WSK_PLK). W programie przyk�adowym wykonywane jest kolejno: * utworzenie na dysku pliku PROBA.DAT; * zapis do pliku wprowadzonych z klawiatury liczb ca�kowitych typu int; * zamkni�cie pliku; * otwarcie pliku do odczytu; * ustawienie wska�nika na ko�cu pliku; * odczyt z pliku od ko�ca; * wyprowadzenie odczytanych z pliku danych na ekran. [P073.CPP] # include "sys\stat.h" # include "conio.h" # include "stdio.h" # include "io.h" # include "fcntl.h" # define Cofnij_o_Zero 0 # define dwa_bajty 2 int Numer = 0; int Plik, L, M, i; long int Dlug_Pliku; main() { clrscr(); creat("A:\PROBA.DAT", S_IWRITE); printf("\nPodaj liczbe rozna od zera, zero - KONIEC"); _fmode=O_BINARY; Plik=open("A:\PROBA.DAT", O_WRONLY); do { printf("\n Nr liczby \t%d\t\t", Numer++); scanf("%d", &L); if (L) write(Plik, &L, 2); } while (L != 0); close(Plik); getch(); printf("\n Teraz odczytam te liczby z pliku \n"); Plik=open("A:\PROBA.DAT", O_RDONLY); Dlug_Pliku=lseek(Plik, 0, SEEK_END); for (i=Dlug_Pliku-dwa_bajty; i>=0; i-=2) { lseek(Plik, i, SEEK_SET); read(Plik, &M, dwa_bajty); printf("%d, ", M); } close(Plik); getch(); return 0; } [Z] ________________________________________________________________ Opracuj program wykonuj�cy operacje na tekstach opisane wcze�niej na �a�cuchach tekstowych pobieranych z zewn�trznych plik�w dyskowych i umieszczanych w wynikowych plikach tekstowych. ________________________________________________________________
ZAZZY