Program 7 Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku. #include<iostream> #include<fstream> using namespace std; int main() { fstream str; char nazwa_pliku[20]; char linia_pliku[200]; cout<<"podaj nazwe pliku: "<<endl; cin>>nazwa_pliku; str.open(nazwa_pliku,ios::out ios::app); str<<"*"; cout<<"gwiazdka dopisana"<<endl; str.open(nazwa_pliku,ios::in); cout<<"czytam z pliku"<<endl; while(!str.eof()) { str.getline(linia_pliku,200); cout << linia_pliku << endl; }; system("pause"); }
Omówienie programu Definicja strumienia o nazwie str: fstream str; Kilka słów o strumieniach Strumienie są niezbędne jeŝeli chcemy czytać i zapisywać dane z/do plików. Istnieją 3 typy strumieni: ofstream - strumień przeznaczony do zapisu do plików ifstream - strumień przeznaczony do odczytu z plików fstream - strumień umoŝliwiający obie powyŝsze czynności Definicja strumienia wygląda następująco: typ_strumienia nazwa_strumienia; Z zatem powyŝej zdefiniowany jest strumień umoŝliwiający zapis i odczyt z pliku (typ: fstream) o nazwie str. Mamy zdefiniowany strumień o nazwie str. Musimy teraz związać strumień z konkretnym plikiem i otworzyć ten plik. SłuŜy do tego instrukcja: nazwa_strumienia.open("nazwa_pliku",opcjonalny_tryb_otwarcia_pliku); Istnieje kilka opcjonalnych trybów otwarcia pliku: ios::in - otwarcie pliku do czytania (input) ios::out - otwarcie pliku do pisania (output) ios::ate - otwarcie pliku z ustawieniem się na końcu jego zawartości (at end) ios::app - otwarcie do dopisywania na końcu pliku (append) ios::trunc - otwarcie, a jeśli plik istnieje - skasowanie umieszczonej w nim treści (truncate) ios::binary - tryb ma być binarny (domyślnie przyjmowany jest tekstowy) Szczegółowy opis trybów otwarcia pliku (oraz instrukcji związanych z plikami) moŝna znaleźć na stronie: http://math.uni.lodz.pl/~polrola/strony/0607l-podyplom/o_plikach.html
JeŜeli np. chcemy otworzyć plik dane.txt w trybie do odczytu (będziemy czytać dane z pliku) moŝemy to zrobić w następujący sposób: ifstream a; a.open( dane.txt,ios::in) Pierwsza linia to definicja strumienia (o nazwie a) przeznaczonego do odczytu z pliku (dlatego typ ifstream). Druga linijka to otwarcie przy uŝyciu strumienia a pliku dane.txt w trybie do czytania (ios::in). W omawianym programie mamy: cout<<"podaj nazwe pliku: "<<endl; cin>>nazwa_pliku; A zatem wprowadzamy nazwę pliku (samą nazwę pliku+rozszerzenie podajemy wtedy gdy plik znajduje się w tym samym katalogu w którym znajduje się omawiany program, jeŝeli plik taki nie istnieje zostanie utworzony) z klawiatury i zapisujemy ją w tablicy znaków (typ char) o nazwie nazwa_pliku (druga linijka programu to char nazwa_pliku[20]; czyli definicja dwudziestoelementowej tablicy typu char o nazwie nazwa_pliku). Następna linijka w programie to: str.open(nazwa_pliku,ios::out ios::app); Czyli wykorzystujemy zdefiniowany wcześniej strumień o nazwie str do otwarcia pliku o nazwie zapisanej w tablicy nazwa_pliku. Plik otwieramy w trybie do zapisu (ios::out) z dopisywania na końcu pliku (ios::app). Wykorzystaliśmy przy tym moŝliwość łączenia trybów otwarcia przy pomocy operatora sumy bitowej " ". Następna linijka programu to: str<<"*"; Co to oznacza? ZauwaŜmy, Ŝe powyŝsza instrukcja przypomina instrukcję: cin<<"*"; Instrukcja ta powoduje wypisanie gwiazdki * na ekranie (wysłanie gwiazdki na ekran). Dzieje się tak dlatego, Ŝe wykorzystany jest w niej strumień cin związany z ekranem. W instrukcji: str<<"*";
mamy strumień związany z pewnym plikiem (plikiem o nazwie zapisanej w tablicy nazwa_pliku). A zatem gwiazdka * zostanie przesłana do tego pliku. PoniewaŜ plik jest otwarty w trybie dopisywania do końca pliku (patrz wyjaśnienie powyŝej) zatem gwiazdka zostanie dopisana na końcu pliku. Po wykonaniu powyŝszej operacji na pliku zamykamy strumień czyli kończymy prace z plikiem: Po zakończeniu pracy z plikiem strumień moŝe zostać ponownie uŝyty do pracy z innym plikiem pod warunkiem, Ŝe będzie uŝyty do takich celów, na jakie pozwala jego definicja (czyli np. strumienia typu ofstream nie moŝemy wykorzystać do odczytu pliku). W naszym programie ten sam strumień jest wykorzystany ponownie: str.open(nazwa_pliku,ios::in); A zatem wykorzystujemy ponownie zdefiniowany wcześniej strumień o nazwie str do otwarcia pliku o nazwie zapisanej w tablicy nazwa_pliku. Tym razem plik otwieramy w trybie do odczytu (ios::in). Następnie na ekran wypisywany jest komunikat czytam z pliku: cout<<"czytam z pliku"<<endl; Dalej mamy w programie następującą pętle: while(!str.eof()) { }; Pętla jest wykonywana dopóki nie dojdziemy do końca pliku otwartego przy pomocy strumienia str (eof end of file). A zatem dopóki nie dojdziemy do końca pliku otwartego przy pomocy strumienia str wykonywane są instrukcje: str.getline(linia_pliku,200); cout << linia_pliku << endl; Pierwsza instrukcja:
str.getline(linia_pliku,200); to pobranie z pliku otwartego przy pomocy strumienia str linii tekstu i zapisanie jej w tablicy o nazwie linia_pliku o rozmiarze 200 (tablica ta została zdefiniowana wcześniej patrz instrukcja char linia_pliku[200]; na początku programu). Po umieszczeniu zawartości jednej linii pliku w tablicy o nazwie linia_pliku zawartość tablicy jest wypisywana na ekran: cout << linia_pliku << endl; Następnie jest wypisywana następna linia z pliku, itd. Jak juŝ wiemy wypisywanie kończy się wtedy gdy dojdziemy do końca pliku (czyli gdy wypiszemy wszystkie jego linie). Przed ostatnia instrukcja programu to: Czyli zamknięcie strumienia str.