INF2_32.pdf

(139 KB) Pobierz
Politechnika Białostocka
Wydział Elektryczny
Katedra Elektrotechniki Teoretycznej i Metrologii
Spis treści
1. Opis stanowiska ............................................................................................. 3
1.1. Stosowana aparatura ............................................................................... 3
1.2. Oprogramowanie ...................................................................................... 3
2. Wiadomości teoretyczne................................................................................ 3
2.1. Schemat przetwarzania pliku .................................................................... 3
2.2. Otwarcie i zamknięcie pliku (strumienia)................................................... 4
2.3. Formatowane operacje wejścia-wyjścia.................................................... 8
2.4. Nieformatowane operacje wejścia-wyjścia ............................................. 11
3. Przebieg ćwiczenia ....................................................................................... 14
4. Literatura ....................................................................................................... 15
5. Wymagania BHP ........................................................................................... 16
Instrukcja
do pracowni specjalistycznej z przedmiotu
Informatyka 2
Kod przedmiotu:
ES1C300 016
(studia stacjonarne)
OBSŁUGA PLIKÓW W JĘZYKU C++
Numer ćwiczenia
INF32
_____________
Materiały dydaktyczne przeznaczone dla studentów Wydziału Elektrycznego PB.
Autor:
dr inż. Jarosław Forenc
Białystok 2015
© Wydział Elektryczny, Politechnika Białostocka, 2015 (wersja 1.3)
Wszelkie prawa zastrzeżone. Żadna część tej publikacji nie może być kopiowana i odtwarzana
w jakiejkolwiek formie i przy użyciu jakichkolwiek środków bez zgody posiadacza praw
autorskich.
Informatyka 2
2 z 17
Instrukcja INF32
1. Opis stanowiska
1.1. Stosowana aparatura
Podczas zajęć wykorzystywany jest komputer klasy PC z systemem
operacyjnym Microsoft Windows (XP/Vista/7).
Na Rys. 1 przedstawiona jest uproszczona hierarchia klas strumieni
stosowanych w języku C++.
1.2. Oprogramowanie
Na komputerach zainstalowane jest środowisko programistyczne Microsoft
Visual Studio 2008 Standard Edition lub Microsoft Visual Studio 2008 Express
Edition zawierające kompilator Microsoft Visual C++ 2008 oraz środowisko Turbo
C++ 2006 Explorer firmy Borland.
2. Wiadomości teoretyczne
2.1. Schemat przetwarzania pliku
Rys. 1. Uproszczona hierarchia klas strumieni w języku C++ [1]
Do przetwarzania plików w języku C++ stosowane są
strumienie
zrealizowane w postaci klas. Do podstawowych klas należą:
-
ofstream
(output
file stream)
- klasa zapewniająca zapis do pliku;
-
ifstream
(input
file stream)
- klasa zapewniająca odczytywanie pliku;
-
fstream
(file
stream)
- klasa zapewniająca zapis i odczytywanie pliku.
Zastosowanie powyższych klas wymaga dołączenia w programie pliku
nagłówkowego
fstream.
Nazwy zadeklarowane w tym pliku wchodzą w skład
przestrzeni nazw
std.
Dodanie
dyrektywy using namespace std;
spowoduje brak
konieczności dodawania kwalifikatora zakresu
std::
przed każdą nazwą.
#include
<iostream>
#include
<fstream>
using namespace
std;
Zazwyczaj operacje związane z przetwarzaniem pliku składają się z czterech
etapów:
1. Zdefiniowanie strumienia czyli stworzenie obiektu jednej z klas:
ifstream,
ofstream, fstream.
2. Otwarcie pliku (określenie z jakim plikiem strumień ma komunikować się).
3. Wykonanie operacji na pliku.
4. Zamknięcie pliku (zlikwidowanie strumienia).
2.2. Otwarcie i zamknięcie pliku (strumienia)
Strumień można otworzyć albo za pomocą konstruktora danej klasy albo
wywołując jej funkcję składową
open().
Konstruktor i funkcja
open()
mają
dokładnie takie same argumenty.
Informatyka 2
3 z 17
Instrukcja INF32
Informatyka 2
4 z 17
Instrukcja INF32
open()
void
open(const
char
*fname, ios_base::openmode mode);
ios::ate
-
pierwszy argument (fname) jest nazwą pliku z ewentualną ścieżką dostępu
podaną w postaci tablicy znaków zakończonej
‘\0’
(C-string);
-
mode
określa tryb pracy z plikiem (rodzaj dostępu do pliku); jako tryb może
występować:
o
in
(input) - otwarcie pliku do czytania;
o
out
(output) - otwarcie pliku do pisania;
o
ate
(at
end)
- otwarcie pliku i ustawienie na jego końcu;
o
app
(append) - otwarcie pliku do dopisywania na jego końcu;
o
trunc
(truncate) - otwarcie pliku i skasowanie aktualnej zawartości;
o
binary
(binary) - otwarcie pliku w trybie binarnym (domyślnie plik jest
otwierany w trybie tekstowym);
-
wszystkie tryby zebrane są w klasie
ios_base;
tryby można stosować
pojedynczo lub po kilka równocześnie, łącząc je bitowym operatorem
alternatywy -
|
(często stosowane tryby otwarcia przedstawia Tabela 1);
Tabela 1. Tryby otwarcia pliku
-
po otwarciu pliku (do czytania lub pisania) wskaźnik ustawia się
na koniec pliku
-
dotychczasowa zawartość pliku nie jest usuwana
-
otwarcie pliku do dopisywania na jego końcu
-
domyślnie, niejawnie, dodawany jest tryb
ios:out
-
jeśli plik nie istnieje, to zostanie utworzony
-
jeśli plik istnieje, to jego dotychczasowa zawartość zostanie
usunięta
-
tryb ten jest domyślnie zakładany, gdy zastosowano tryb
ios::out
bez
ios::app
lub
ios::ate
-
włączenie trybu binarnego
ios::app
ios::trunc
ios::binary
-
w klasie
ifstream
domyślnym trybem otwarcia jest
ios::in,
zaś w klasie
ofstream
-
ios::out;
Tabela 2 pokazuje powiązania pomiędzy trybami otwarcia stosowanymi
w języku C++ i w języku C.
Tabela 2. Tryby otwarcia pliku w języku C++ i w języku C [1]
Suma trybów w języku C++
in
out
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
trunc
app
binary
Tryb
w języku C
w
a
w
r
r+
w+
wb
ab
wb
rb
r+b
w+b
Tryb
Opis
-
otwarcie pliku do odczytu
-
tryb może być zastosowany tylko dla strumieni z klas
ifstream
i
fstream
-
otwierany plik musi już istnieć
-
otwarcie pliku do zapisu
-
tryb może być zastosowany tylko dla strumieni z klas
ofstream
i
fstream
-
jeśli plik nie istnieje, to zostanie utworzony
-
jeśli plik istnieje, to jego stara zawartość zostanie usunięta
-
otwarcie pliku do czytania i pisania
-
otwierany plik musi już istnieć
ios::in
ios:out
ios::in | ios:out
Informatyka 2
5 z 17
Instrukcja INF32
Informatyka 2
6 z 17
Instrukcja INF32
Poniżej zamieszczono przykłady otwarcia plików.
ofstream ofs;
ofs.open("dane.txt");
Zamknięcie pliku odbywa się poprzez wywołanie metody
close().
close()
void
close();
-
funkcja
close()
zamyka plik skojarzony z otwartym strumieniem.
-
wywołanie funkcji składowej
open()
z klasy
ofstream
w celu otwarcie pliku
dane.txt
w trybie tekstowym (domyślny tryb) do zapisu (ios::out - domyślny
tryb dla klasy
ofstream);
ifstream ifs("dane.txt");
ofstream ofs;
ofs.open("dane.txt");
// operacje na pliku
ofs.close();
-
zastosowanie konstruktora klasy
ifstream
w celu otwarcie pliku
dane.txt
w trybie tekstowym (domyślny tryb) do odczytu (ios::in - domyślny tryb dla
klasy
ifstream);
ifstream ifs;
ifs.open("D:\\doc\\dane.dat",ios::in | ios::binary);
2.3. Formatowane operacje wejścia-wyjścia
Klasa
ofstream
jest pochodną klasy
ostream,
klasa
ifstream
jest pochodną
klasy
istream,
zaś klasa
fstream
jest pochodną klasy
iostream
(Rys. 1). Oznacza
to, ze wszystko co dotyczyło strumieni
iostream
(manipulatory, operatory
<<
i
>>)
dotyczy także operacji na plikach.
W poniższym programie zapisywane są do macierzy wygenerowane
pseudolosowo liczby zmiennoprzecinkowe typu
float
z zakresu
(-50, 50).
Następnie elementy macierzy zapisywane są do pliku tekstowego
liczby.txt
(z podziałem na wiersze i kolumny oraz z dokładnością do trzech cyfr po kropce
dziesiętnej).
Zapisanie liczb zmiennoprzecinkowych do macierzy i pliku tekstowego.
#include
<iostream>
#include
<fstream>
#include
<iomanip>
#include
<ctime>
using namespace
std;
#define
N 4
#define
M 5
-
otwarcie pliku
dane.dat
znajdującego się na dysku
D:
w folderze
doc
do
odczytu (ios::in) w trybie binarnym (ios::binary);
ofstream ofs;
string fname("D:\\doc\\dane.txt");
ofs.open(fname.c_str(),ios::out);
-
otwarcie pliku
dane.txt
znajdującego się na dysku
D:
w folderze
doc
do
zapisu (ios::out) w trybie tekstowym (domyślny tryb);
-
nazwa otwieranego pliku przechowywana jest w obiekcie
fname
klasy
string,
zaś funkcja
open()
wymaga argumentu typu
char *
(C-string); w celu
zapewnienia zgodności typów wywoływana jest funkcja
c_str()
zwracająca
tekst przechowywany w obiekcie w postaci tablicy znaków (C-string).
Informatyka 2
7 z 17
Instrukcja INF32
Informatyka 2
8 z 17
Instrukcja INF32
int
main()
{
float
T[N][M];
int
i, j;
ofstream ofs;
ofs.open("liczby.txt");
if
(!ofs)
{
cout <<
"Blad otwarcia pliku!"
<< endl;
return
0;
}
srand((unsigned
int)time(NULL));
for
(i=0; i<N; i++)
for
(j=0; j<M; j++)
T[i][j] = 100*(float)rand()/RAND_MAX - 50;
ofs << fixed << setprecision(3);
for
(i=0; i<N; i++)
{
for
(j=0; j<M; j++)
ofs << setw(10) << T[i][j];
ofs << endl;
}
ofs.close();
}
Wyświetlenie liczb zmiennoprzecinkowych odczytanych z pliku tekstowego.
#include
<iostream>
#include
<fstream>
#include
<iomanip>
using namespace
std;
#define
N 4
#define
M 5
int
main()
{
int
i, j;
float
x;
ifstream ifs;
ifs.open("liczby.txt");
if
(!ifs)
{
cout <<
"Blad otwarcia pliku!"
<< endl;
return
0;
}
cout << fixed << setprecision(3);
for
(i=0; i<N; i++)
{
for
(j=0; j<M; j++)
{
ifs >> x;
cout << setw(10) << x;
}
cout << endl;
}
ifs.close();
}
Zapis do pliku odbywa się za pośrednictwem strumienia
ofs.
Sposób formatowania
liczb w pliku określają manipulatory
fixed, seprecision()
i
setw().
Przykładowa
zawartość pliku
liczby.txt:
-34.048
31.423
-30.712
42.730
-24.453
-9.053
9.923
-49.066
21.288
39.438
-5.895
-29.186
17.876
21.139
44.351
13.762
4.579
19.475
-27.886
18.917
Jeśli nie jest znana ilość liczb zapisanych w pliku, to można je wszystkie odczytać
i wyświetlić na ekranie stosując jedną pętlę
while.
while
(ifs >> x)
cout << setw(10) << x;
Kolejny program wyświetla na ekranie zawartość pliku
liczby.txt.
Informatyka 2
9 z 17
Instrukcja INF32
Informatyka 2
10 z 17
Instrukcja INF32
Zgłoś jeśli naruszono regulamin