Implementacje algorytmów, struktur danych w języku C/C++. Drzewa binarne,listy jednokierunkowe,dwukierunkowe,tablice dynamiczne, wskaźniki.
sobota, 19 lutego 2011
niedziela, 23 stycznia 2011
C++ ofstream
#include iostream
#include fstream.h
using namespace std;
char sciezka[100]; //sciezka do zapisu
void zapisz_do_pliku(char *sciezka){
ofstream plik;
plik.open(sciezka);
char c;
int i=0;
char tekst[1000];
cout <<"Podaj tekst do zapisania:\n";
cin.get(c);
cin.get(c);
while ( c != '\n' )
{
if(c!='\n'){
tekst[i]=c;
i++;
cin.get(c);}
}
plik<< tekst;
}
string odczyt(void){
ifstream plik;
plik.open(sciezka);
string tekst;
while(getline(plik,tekst))
{
getline(plik,tekst);
}
plik.close();
return tekst;
}
int main()
{
cout<<"Podaj sciezke do pliku:\n";
cin >>sciezka;
zapisz_do_pliku(sciezka);
string a;
cout<<"Plik odczytany: \n\n-----------------------------------------------\n\n";
a=odczyt();
cout<
Przeciążanie operatorów w języku C++
#includeusing namespace std; class zespol{ private: double re,im; public: zespol(){ re=0; im=0; } zespol(double r,double i) { re=r; im=i; } zespol operator +(zespol A) { return zespol(re+A.re,im+A.im); } zespol operator -(zespol B) { return zespol(re-B.re,im-B.im); } zespol operator *(zespol C){ return zespol((re*C.re-im*C.im),re*C.im+im*C.re); } zespol operator /(zespol D){ return zespol(re/D.re,im/D.im); } friend ostream & operator<< (ostream &wyjscie,zespol &E); friend istream & operator >>(istream &wejscie,zespol &E); zespol get(double r,double i){ return zespol(r,i); } void wypisz(void){ cout<<"\n----------------\n"<<"re: "< >(istream &wejscie,zespol &E){ cout<<"Podaj re: "; wejscie>>E.re; cout<<"Podaj im: "; wejscie>>E.im; return wejscie; } int main() { zespol z,a,b,c,d, z1(1,2),z2(9,8); z=z1+z2; a=z1-z2; b=z1*z2; c=z1/z2; cout<<"\n----Dodawanie:\n"; z.wypisz(); cout<<"\n----Odejmowanie: \n"; a.wypisz(); cout<<"\n----Mnozenie: \n"; b.wypisz(); cout<<"\n----Dzielenie: \n"; c.wypisz(); cout<< c; cout<<(z=z1+z2); cin>> d; cout<
niedziela, 1 sierpnia 2010
Podstawy programowania w systemach UNIX/LINUX cz. 1
W pierwszej kolejności zajmiemy się obsługą systemu plików.System plików to daje użytkownikowi możliwość dostępu do danych przechowywanych w pamięci pomocniczej(np. dysk). Jest on także odpowiedzialny za zarządzanie plikami i przydzielanie im pamięci, za administrowanie pamięcią wolna oraz sterownie dostępem do plików.Procesy(wykonujące się programy) komunikują się z systemem plików poprzez funkcje systemowe.
Jądro systemu operacyjnego UNIX udostępnia nam dwie podstawowe operacje zapis i odczyt , przy pomocy funkcji systemowych write i read .Trzeba wiedzieć ,że plik traktowany jest jako tablica bajtów dzięki temu możemy operować na nim z dokładnością co do bajtu.
Aby móc wykonywać operacje na pliku trzeba najpierw go otworzyć ,do tego celu posłuży nam funkcja open. Zwraca ona deskryptor pliku,zapytacie pewnie czym jest ów "deskryptor" . Jest to liczba ,która "opisuje" , a mówiąc bardziej precyzyjnie identyfikuje plik. Standardowo deskryptory 0, 1, 2 przydzielone są standardowemu wejściu,wyjściu i wyjściu diagnostycznemu.
Przy otwieraniu pliku przekazywany jest tryb otwarcia , który określa dopuszczalne operacje jakie można wykonać w związku z tym otwarciem (tylko zapis, tylko odczyt etc.)
Poniżej zamieszczam definicje najważniejszych funkcji systemowych:
int creat(const char *pathname, mode_t mode)
Wartości zwracane:
poprawne wykonanie funkcji: deskryptor otwartego pliku
zakończenie błędne: - 1
Argumenty funkcji:
pathname – wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty
mode – prawa dostępu (np. 0640)
Opis:
Funkcja tworzy nowy plik, którego lokalizacja zależy od parametru pathname , a prawa dostępu od parametru mode .
int open(const char *pathname, int flags[, mode_t mode])
Wartości zwracane:
poprawne wykonanie funkcji: deskryptor otwartego pliku
zakończenie błędne: - 1
Argumenty funkcji:
pathname – wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty
flags – metoda dostępu
• O_RDONLY – otwarcie w trybie tylko do odczytu
• O_WRONLY – otwarcie w trybie tylko do zapisu
• O_RDWR –- otwarcie w trybie do odczytu i do zapisu
Argument flags może być połączony bitowym OR z jedną (lub więcej) z następujących wartości:
• O_CREAT – utworzenie pliku, jeśli plik jeszcze nie istnieje,
• O_TRUNC – obcięcie pliku, jeśli plik istnieje i otwierany jest w trybie
O_WRONLY lub O_RDWR,
• O_EXCL – powoduje zgłoszenie błędu jeśli plik już istnieje i otwierany jest z flagą O_CREAT
• O_APPEND – operacje pisania odbywają się na końcu pliku.
mode – prawa dostępu, jest to argument opcjonalny
Opis:
Parametr wejściowy pathname jest nazwą (w szczególności pełną nazwą ścieżkową) pliku, parametr wejściowy flags oznacza tryb otwarcia pliku pliku i może mieć następujące wartości: O_RDONLY, O_WRONLY, O_RDWR .
int close(int fd)
Wartości zwracane:
poprawne wykonanie funkcji: 0
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor zamykanego pliku
Opis:
Funkcja zamyka deskryptor pliku przekazany przez parametr fd .
int read(inf fd, void *buf, size_t count)
Wartości zwracane:
poprawne wykonanie funkcji: rzeczywista liczba bajtów, jaką udało się odczytać
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor pliku z którego mają zostać odczytane dane
buf – adres bufora znajdującego się w segmencie danych procesu, do którego zostaną przekazane dane odczytane z pliku w wyniku wywołania funkcji read
count – ilość bajtów do odczytania
Opis:
Odczyt danych z pliku. Funkcja powoduje odczyt count bajtów z otwartego pliku, identyfikowanego przez deskryptor fd , począwszy od bieżącej pozycji wskaźnika do pliku i umieszczenie ich pod adresem buf w przestrzeni adresowej procesu. Funkcja zwraca liczbę bajtów na której udało się wykonać operację (zero oznacza koniec pliku). Odczyt powoduje zmianę wskaźnika bieżącej pozycji w pliku. Po otwarciu pliku wskaźnik ten ustawiony jest na 0, czyli na początek pliku, a po kolejnych operacjach przesuwa się w kierunku końca pliku o tyle bajtów ile udało się odczytać.
int write(inf fd, void *buf, size_t count)
Wartości zwracane:
poprawne wykonanie funkcji: rzeczywista liczba bajtów, jaką udało się zapisać
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor pliku do którego mają zostać zapisane dane
buf – adres bufora znajdującego się w segmencie danych procesu, z którego zostaną pobrane dane zapisane przez funkcję write
count – ilość bajtów do zapisania
Opis:
Funkcja powoduje zapis count bajtów do otwartego pliku, identyfikowanego
przez deskryptor fd , począwszy od bieżącej pozycji wskaźnika do pliku i umieszczenie ich pod
adresem buf w przestrzeni adresowej procesu. Funkcja zwraca liczbę bajtów na której udało się
wykonać operację.
Podobnie jak dla funkcji read zapis powoduje zmianę wskaźnika bieżącej pozycji w pliku.
Czas na praktykę. Napiszemy prosty program , którego zadaniem będzie
kopiowanie pliku podanego przez użytkownika:
Jądro systemu operacyjnego UNIX udostępnia nam dwie podstawowe operacje zapis i odczyt , przy pomocy funkcji systemowych write i read .Trzeba wiedzieć ,że plik traktowany jest jako tablica bajtów dzięki temu możemy operować na nim z dokładnością co do bajtu.
Aby móc wykonywać operacje na pliku trzeba najpierw go otworzyć ,do tego celu posłuży nam funkcja open. Zwraca ona deskryptor pliku,zapytacie pewnie czym jest ów "deskryptor" . Jest to liczba ,która "opisuje" , a mówiąc bardziej precyzyjnie identyfikuje plik. Standardowo deskryptory 0, 1, 2 przydzielone są standardowemu wejściu,wyjściu i wyjściu diagnostycznemu.
Przy otwieraniu pliku przekazywany jest tryb otwarcia , który określa dopuszczalne operacje jakie można wykonać w związku z tym otwarciem (tylko zapis, tylko odczyt etc.)
Poniżej zamieszczam definicje najważniejszych funkcji systemowych:
int creat(const char *pathname, mode_t mode)
Wartości zwracane:
poprawne wykonanie funkcji: deskryptor otwartego pliku
zakończenie błędne: - 1
Argumenty funkcji:
pathname – wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty
mode – prawa dostępu (np. 0640)
Opis:
Funkcja tworzy nowy plik, którego lokalizacja zależy od parametru pathname , a prawa dostępu od parametru mode .
int open(const char *pathname, int flags[, mode_t mode])
Wartości zwracane:
poprawne wykonanie funkcji: deskryptor otwartego pliku
zakończenie błędne: - 1
Argumenty funkcji:
pathname – wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty
flags – metoda dostępu
• O_RDONLY – otwarcie w trybie tylko do odczytu
• O_WRONLY – otwarcie w trybie tylko do zapisu
• O_RDWR –- otwarcie w trybie do odczytu i do zapisu
Argument flags może być połączony bitowym OR z jedną (lub więcej) z następujących wartości:
• O_CREAT – utworzenie pliku, jeśli plik jeszcze nie istnieje,
• O_TRUNC – obcięcie pliku, jeśli plik istnieje i otwierany jest w trybie
O_WRONLY lub O_RDWR,
• O_EXCL – powoduje zgłoszenie błędu jeśli plik już istnieje i otwierany jest z flagą O_CREAT
• O_APPEND – operacje pisania odbywają się na końcu pliku.
mode – prawa dostępu, jest to argument opcjonalny
Opis:
Parametr wejściowy pathname jest nazwą (w szczególności pełną nazwą ścieżkową) pliku, parametr wejściowy flags oznacza tryb otwarcia pliku pliku i może mieć następujące wartości: O_RDONLY, O_WRONLY, O_RDWR .
int close(int fd)
Wartości zwracane:
poprawne wykonanie funkcji: 0
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor zamykanego pliku
Opis:
Funkcja zamyka deskryptor pliku przekazany przez parametr fd .
int read(inf fd, void *buf, size_t count)
Wartości zwracane:
poprawne wykonanie funkcji: rzeczywista liczba bajtów, jaką udało się odczytać
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor pliku z którego mają zostać odczytane dane
buf – adres bufora znajdującego się w segmencie danych procesu, do którego zostaną przekazane dane odczytane z pliku w wyniku wywołania funkcji read
count – ilość bajtów do odczytania
Opis:
Odczyt danych z pliku. Funkcja powoduje odczyt count bajtów z otwartego pliku, identyfikowanego przez deskryptor fd , począwszy od bieżącej pozycji wskaźnika do pliku i umieszczenie ich pod adresem buf w przestrzeni adresowej procesu. Funkcja zwraca liczbę bajtów na której udało się wykonać operację (zero oznacza koniec pliku). Odczyt powoduje zmianę wskaźnika bieżącej pozycji w pliku. Po otwarciu pliku wskaźnik ten ustawiony jest na 0, czyli na początek pliku, a po kolejnych operacjach przesuwa się w kierunku końca pliku o tyle bajtów ile udało się odczytać.
int write(inf fd, void *buf, size_t count)
Wartości zwracane:
poprawne wykonanie funkcji: rzeczywista liczba bajtów, jaką udało się zapisać
zakończenie błędne: - 1
Argumenty funkcji:
fd – deskryptor pliku do którego mają zostać zapisane dane
buf – adres bufora znajdującego się w segmencie danych procesu, z którego zostaną pobrane dane zapisane przez funkcję write
count – ilość bajtów do zapisania
Opis:
Funkcja powoduje zapis count bajtów do otwartego pliku, identyfikowanego
przez deskryptor fd , począwszy od bieżącej pozycji wskaźnika do pliku i umieszczenie ich pod
adresem buf w przestrzeni adresowej procesu. Funkcja zwraca liczbę bajtów na której udało się
wykonać operację.
Podobnie jak dla funkcji read zapis powoduje zmianę wskaźnika bieżącej pozycji w pliku.
Czas na praktykę. Napiszemy prosty program , którego zadaniem będzie
kopiowanie pliku podanego przez użytkownika:
#include fcntl.h
#include stdio.h
#define BUF_SIZE 1024
int main(int argc, char* argv[]){
char buf[BUF_SIZE];
int desc_1,desc_2;
int odczytano=0;
if (argc<3){
fprintf(stderr, "Zla ilosc argumentow !!");
exit(1);
}
desc_1 = open(argv[1], O_RDONLY);
if (desc_1 == -1){
perror("Blad otwarcia pliku zrodlowego");
exit(1);
}
desc_1 = creat(argv[2], 0640);
if (desc_1 == -1){
perror("Blad utworzenia pliku docelowego");
exit(1);
}
while((odczytano = read(desc_1, BUF_SIZE, MAX)) > 0){
if (write(desc_2, buf, lbajt) == -1){
perror("Blad zapisu pliku docelowego");
exit(1);
}
}
if (odczytano== -1){
perror("Blad odczytu pliku zrodlowego");
exit(1);
}
if (close(desc_1) == -1 || close(desc_2) == -1){
perror("Blad zamkniecia pliku");
exit(1);
}
exit(0);
}
Subskrybuj:
Posty (Atom)