LEKCJA19.TXT

(8 KB) Pobierz
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. 
________________________________________________________________ 
Zgłoś jeśli naruszono regulamin