Programowanie 2. Język C++. Wykład 12. 1 12.1 Klasa iostream

Transkrypt

Programowanie 2. Język C++. Wykład 12. 1 12.1 Klasa iostream
Programowanie 2. Język C++. Wykład 12.
12.1
12.2
12.3
12.1
Klasa iostream ...................................................................................................................................... 1
Klasy ofstream, ifstream .............................................................................................................. 3
Struktura FILE ...................................................................................................................................... 8
Klasa iostream
Obiekty klasy stream tworzone automatycznie:
• istream& cin, standardowe wejście konsoli (klawiatura).
• ostream& cout, standardowe wyjście konsoli(ekran).
• ostream& cprn, standardowy port równoległy LPT1 (drukarka).
• ostream& cerr, standardowe wyjście dla błędów.
• ostream& clog, standardowe wyjście dla logów.
• ostream& caux, standardowe dodatkowe wyjście.
Klasy Stream, wymagane jest dołączenie plików nagłówkowych <fstream> i/lub <strstream>:
• fstream, klasa wejścia/wyjścia dla pliku,
• ifstream, klasa wejścia dla pliku,
• istrstream, klasa wejścia stringu,
• ofstream, klasa wyjścia dla pliku,
• ostrstream, klasa wyjścia dla typu string,
• strstream, klasa string I/O.
Metody klasy stream:
Metoda
void close()
int eof()
char fill(char fill_ch | void)
int fail()
istream& get(int ch)
istream&
getline(char* ch_string, int maxsize, char delimit)
istream& ignore(int length[, int delimit])
Opis
Zamyka obiekt I/O.
Zawraca wartość true, gdy koniec osiągnięto koniec
strumienia.
Ustawia lub zwraca znak fill_ch.
Zawraca wartość true, gdy chociaŜ jedna operacja
wejścia/wyjścia zakończyła się niepowodzeniem.
Pobiera znak jako typ int (moŜe równieŜ pobrać
wartość EOF (-1).
Pobiera linię do bufora ch_string z maksymalną
długością i dodaje znak końca.
iostream& open(char* filename, int mode)
Czyta i opuszcza (ignoruje) liczbę znaków określoną
przez długość strumienia do czasu znalezienia znaku
EOF.
Otwiera plik w określonym trybie.
int peek();
Zwraca następny znak w strumieniu bez usuwania go.
int precision(int prec | void)
Ustawia lub zwraca liczbę cyfr w liczbie typu float.
ostream& put(char ch)
Wstawia określony znak do strumienia.
istream& putback(char ch)
Zwraca określony znak do strumienia.
_read( int fd, void *buffer, unsigned int count )
Czyta dane z pliku.
long setf(long flags [, long mask])
Ustawia (zwraca) określone flagi ios.
long unsetf(long flags)
Czyści określone flagi ios.
int width(int width | void)
ostream& write(const char* buf, int size)
Wstawa lub zwraca szerokość bieŜącego pola.
Zapisuje dane d o pliku.
1
Programowanie 2. Język C++. Wykład 12.
Flagi, określające tryb otwarcia pliku (ios::x):
• app,
otwiera do dopisania (append mode).
• ate,
otwiera i szuka końca pliku.
• in,
otwiera do zapisu (input mode).
• nocreate, błąd, jeŜeli plik nie istnieje.
• noreplace, błąd, jeŜeli plik istnieje.
• out,
otwiera do czytania (output mode).
• trunc, otwiera i opuszcza puste znaki.
• binary, otwiera jako strumień binarny.
Wartości wskaźnika mode funkcji fopen(),_wfopen():
FILE * fopen( const char *filename, const char *mode );
FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );
•
•
•
"r",
"w",
"a",
•
•
•
•
"r+",
"w+",
"a+",
t,
•
•
•
•
•
•
•
b,
c,
n,
S,
R,
T,
D,
otwiera plik do czytania, gdy brak pliku wywołanie fopen() zwraca błąd.
otwiera pusty plik do czytania, gdy plik istnieje zawartość jest nadpisywana (niszczona).
otwiera plik do zapisu (dopisanie, appending), dane zapisuje na końcu pliku bez usuwania znaku
EOF; tworzy plik jeŜeli go nie ma.
otwiera plik do czytania i zapisu, plik musi istnieć.
otwiera pusty plik do czytania i zapisu, gdy plik istnieje zawartość jest nadpisywana.
otwiera pusty plik do czytania i dopisania, tworzy plik jeŜeli go nie ma.
otwiera plik w trybie tekstowym. W tym trybie CTRL+Z jest interpretowany jako znak końca danych
wejściowych.
otwiera plik w trybie binarnym.
UmoŜliwia uŜycie flagi zatwierdzenia (commit flag).
resetuje flagę zatwierdzenia.
określa, optymalizację zapisu do pamięci (caching) dla szeregowego dostępu do dysku.
określa, optymalizację zapisu do pamięci (caching) dla losowego (random) dostępu do dysku.
określa plik jako tymczasowy (temporary).
określa plik jako tymczasowy, plik jest usuwany gdy uchwyt do pliku jest zamykany.
2
Programowanie 2. Język C++. Wykład 12.
12.2
Klasy ofstream, ifstream
Przykład 1. Zapis danych do pliku tekstowego (w12-01a-ofstream.cpp).
#include <fstream>
using namespace std;
void main()
{
ofstream PlikDoZapisu("c:\\plik.txt");
PlikDoZapisu << "Tekst \ndo zapisu. \n";
PlikDoZapisu.close();
}
Przykład 2. Wpisuje i dopisuje tekst do pliku (w12-01b-fstream-append-simple.cpp).
#include <fstream>
using namespace std;
void main()
{
ofstream doPliku("plik.txt");
doPliku << " Nadpisane \n .... \n";
doPliku.close();
doPliku.open("plik.txt", ios::app);
doPliku << " ... i tekst dopisany.";
doPliku.close();
}
Przykład 3. Program pobiera nazwę pliku z klawiatury zapisuje tekst do pliku (w12-02-ofstream-open.cpp).
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
char NazwaPliku[128];
ofstream plikDoZapisu;
cout << "Wpisz nazwe pliku:
cin >> NazwaPliku;
";
plikDoZapisu.open(NazwaPliku);
plikDoZapisu << "Tekst1, tekst2 ...";
plikDoZapisu.close();
}
3
Programowanie 2. Język C++. Wykład 12.
Przykład 4. Program dopisuje tekst do pliku, następnie czyta tekst z pliku (w12-03-fstream-close-open.cpp).
#include <fstream>
#include <iostream>
using namespace std;
void
{
main()
char cTekst[100];
ofstream plikDaneX("c:\\dane.txt", ios::in & ios::app);
cout << "Wpisz tekst: ";
cin >> cTekst;
plikDaneX << cTekst;
plikDaneX.close();
plikDaneX.open("c:\\dane.txt", ios::out);
plikDaneX << cTekst;
cout << cTekst << endl;
plikDaneX.close();
}
Przykład 5. Program zapisuje dane do pliku i czyta dane z pliku (w12-04-fstream-copy-read.cpp).
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ofstream DoPliku("c:\\out.txt");
DoPliku << "Dzien dobry";
DoPliku.close();
char cTab[80];
ifstream zPliku("c:\\out.txt");
zPliku >> cTab;
zPliku.close();
cout << "cTab: " << cTab << endl;
}
4
Programowanie 2. Język C++. Wykład 12.
Przykład 6. Program ustawia kursor na początku i na końcu pliku, róŜnica połoŜeń pozwala wyliczyć wielkość pliku
w bajtach (w12-05-fstream-WielkoscPliku.cpp).
Program wykorzystuje metody tellg(), seekg():
• tellg( ),funkcja zwracana bieŜące połoŜenie w strumieniu.
• seekg(), funkcja wstawia kursor w odpowiednie miejsce w strumieniu.
#include <iostream>
#include <fstream>
using namespace std;
const char * filename = "c:\\plik.pdf";
int main ()
{
long poczatek,koniec;
ifstream DoPliku (filename, ios::in|ios::binary);
poczatek = DoPliku.tellg();
DoPliku.seekg (0, ios::end);
koniec = DoPliku.tellg();
DoPliku.close();
cout << "Wielkosc pliku: " << filename;
cout << " = " << (koniec - poczatek) << " bajtow" << endl;
return 0;
}
5
Programowanie 2. Język C++. Wykład 12.
Przykład 7. Program sprawdza wielkość pliku, ustala wielkość bufora i kopiuje plik do bufora (w12-06-fstreamCopyToBufor.cpp).
#include <iostream>
#include <fstream>
using namespace std;
const char * NazwaPliku = "c:\\plik.pdf";
void main()
{
char * pcBufor;
long BuforSize;
ifstream PlikCzytany(NazwaPliku, ios::in|ios::binary|ios::ate);
BuforSize = PlikCzytany.tellg();
PlikCzytany.seekg (0, ios::beg);
pcBufor = new char [BuforSize];
PlikCzytany.read (pcBufor, BuforSize);
PlikCzytany.close();
cout << "Caly plik zostal wczytany do pamieci" << endl;
delete[] pcBufor;
}
6
Programowanie 2. Język C++. Wykład 12.
Przykład 8. Program wyszukuje zadany string w pliku (w12-07-search-string.cpp).
Program wykorzystuje metody:
• data(), konwertuje string na tablicę znaków.
• c_str(), konwertuje string na c-string (zerem zakończona tablica znaków).
Program wczytuje do bufora stringi z pliku znajdujące się między spacjami.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
string NazwaPliku("c:\\plik.txt");
string szukanyTekst("NAME=\"sSID\"");
ifstream PlikDoCzyt(NazwaPliku.data());
//ifstream PlikDoCzyt(NazwaPliku.c_str());
string sBufor;
if (!PlikDoCzyt)
{
cout << "Blad, brak pliku" << endl;
return 1;
}
while (PlikDoCzyt >> sBufor)
{
if (szukanyTekst==sBufor)
cout <<"Znaleziono tekst: " << sBufor << endl;
}
PlikDoCzyt.close();
return 0;
}
7
Programowanie 2. Język C++. Wykład 12.
12.3
Struktura FILE
Przykład 1. Program czyta z pliku dane tekstowe (w12-08-FILE-fgets.cpp).
Program wykorzystuje funkcję fgets().
• fgets(), funkcja pobiera string ze strumienia.
• fgetws(),funkcja pobiera string ze strumienia.
#include <iostream>
using namespace std;
void main( void )
{
FILE *stream;
char line[100];
if( fopen_s( &stream, "plik.txt", "r" ) == 0 )
{
if( fgets( line, 100, stream ) == NULL)
cout << "blad wywolania fgets() "<< endl;
else
cout << line << endl;
fclose( stream );
}
}
Przykład 2. Program zapisuje do pliku tekst (w12-09-FILE-fputs.cpp).
#include <iostream>
using namespace std;
void main()
{
FILE * pPlik;
errno_t err; // errno_t, wskaźnik typu int
err = fopen_s( &pPlik, "plik.txt", "w" );
fputs ("Tekst1 \nTekst2 \n", pPlik);
fclose(pPlik);
}
8
Programowanie 2. Język C++. Wykład 12.
Przykład 3. Program zapisuje i dopisuje tekst do pliku (w12-10-FILE-fgetpos-fsetpos.cpp).
Program wykorzystuje funkcje:
• fgetpos( FILE *stream, fpos_t *pos ),
stream: wskaźnik do pliku typu FILE.
pos: wskaźnik połoŜenia kursora w strumieniu (w pliku).
Zwracana wartość: 0 gdy funkcja jest wywołana z sukcesem, inna wartość gdy z błędem.
• fsetpos( FILE *stream, const fpos_t *pos ),
stream: wskaźnik do pliku typu FILE.
pos: wskaźnik połoŜenia kursora w strumieniu (w pliku).
Zwracana wartość: 0 gdy funkcja jest wywołana z sukcesem, inna wartość gdy z błędem.
#include <iostream>
using namespace std;
void main ()
{
FILE * pPlik;
fpos_t Pozycja = NULL;
errno_t err;
err = fopen_s( &pPlik, "plik.txt", "w" );
fputs ("Tekst ... ", pPlik);
//
fgetpos (pPlik, &Pozycja);
Pozycja+=9;
cout << Pozycja << endl;
// Pozycja = 10
fsetpos (pPlik, &Pozycja);
fputs (" + dodatkowy tekst", pPlik);
fgetpos (pPlik, &Pozycja);
cout << Pozycja << endl; // Pozycja = 28
fclose (pPlik);
}
9
Programowanie 2. Język C++. Wykład 12.
Przykład 4. Program kopiuje pliki binarne (w12-11-FILE-CopyBinFiles.cpp).
Program wykorzystuje funkcję
fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer: zmienna na dane.
size:
wielkość bufora wyraŜona w bajtach.
count: max. liczba buforów do czytania.
stream: wskaźnik do struktury FILE.
Zwracana wartość: liczba przeczytanych buforów.
#include <iostream>
using namespace std;
#define BUF_SIZE 4096
int main()
{
char buf[BUF_SIZE];
int s;
FILE * plikZrodlowy;
FILE * plikDocelowy;
errno_t err;
err = fopen_s( &plikZrodlowy, "src.doc", "rb" );
err = fopen_s( &plikDocelowy, "dest.doc", "wb" );
if(!plikZrodlowy)
{
cout << "Brak Pliku" << endl;
return 1;
}
while((s=fread(buf, 1, BUF_SIZE, plikZrodlowy))>0)
{
fwrite(buf, 1, s, plikDocelowy);
}
fclose(plikZrodlowy);
fclose(plikDocelowy);
return 0;
}
10