long setf(long setbits, long field) 14.. long unsetf(long).[r]
(1)Chương 7
Các dòng t p tin (Stream)ậ
C cung c p m t th vi n hàm nh p xu t nh printf,ấ ộ ệ ậ ấ
scanf, gets, getch(), puts, puch(), fprintf, fscanf, fopen, fwite, fread, Các hàm làm vi c hi u qu nh ng khơng thích ng v iệ ệ ả ứ
cách t ch c chổ ứ ương trình hướng đ i tố ượng
C++ s d ng khái ni m dòng tin (stream) đ a l p dòngử ụ ệ
tin đ t ch c vi c nh p xu t Dịng tin có th xem nh m t d yể ổ ứ ệ ậ ấ ể ộ ẫ
các byte Thao tác nh p l y (đ c) byte t dịng tin (khi g iậ ấ ọ ọ
là dòng nh p - input) vào b nh Thao tác xu t đ a byte tậ ộ ấ
b nh dịng tin (khi g i dong xu t - output) Các thao tácộ ọ ấ
này đ c l p thi t b Đ th c hi n vi c nh p, xu t lên m t thi tộ ậ ế ị ể ự ệ ệ ậ ấ ộ ế
b c th , ch c n g n dòng tin v i thi t b này.ị ụ ể ỉ ầ ắ ế ị
§ l p streamớ Có l p quan tr ng c n nh là:ớ ọ ầ
+ L p c s iosớ
+ T l p ios d n xu t đ n l p istream ostreamừ ẫ ấ ế
+ Hai l p istream ostream l i d n xu t t i l p iostreamớ ẫ ấ ớ
S đ k th a gi a l p nh sau:ơ ế ữ
ios
istream ostream
iostream L p iosớ
+ Thu c tính c a l p: Trong l p ios đ nh nghĩa thu c tínhộ ủ ớ ị ộ
đượ ục s d ng làm c đ nh d ng cho vi c nh p xu t cờ ị ệ ậ ấ
ki m tra l i (xem bên dể ỗ ưới)
+ Các phương th c: L p ios cung c p m t s phứ ấ ộ ố ương th
ph c v vi c đ nh d ng d li u nh p xu t, ki m tra l i (xem bênụ ụ ệ ị ữ ệ ậ ấ ể ỗ
dưới)
L p istreamớ
L p cung c p toán t nh p >> nhi u phớ ấ ậ ề ương th
nh p khác (xem bên dậ ưới) nh phư ương th c: get, getline, read,ứ
ignore, peek, seekg, tellg, L p ostreamớ
L p cung c p toán t xu t << nhi u phớ ấ ấ ề ương th c xu tứ ấ
khác (xem bên dưới) nh phư ương th c: put, write, flush, seekp,ứ
tellp,
L p iostreamớ
L p th a k phớ ế ương th c nh p xu t c a l pứ ậ ấ ủ
istream ostream
§ Dịng cin tốn t nh pử ậ
Dòng cin m t đ i tộ ố ượng ki u istream đ nh nghĩa C++ể ị
Đó dịng vào (input) chu n g n v i bàn phím (tẩ ắ ương t nhự
stdin c a C) Các thao tác nh p dòng cin đ ng nghĩa v i nh pủ ậ ậ
d li u t bàn phím ữ ệ
Do cin m t đ i tộ ố ượng c a l p istream nên v i cin chung ta cóủ ớ
th s d ng toán t nh p >> phể ụ ậ ương th c nh p c a l pứ ậ ủ
ios istream
Cách dùng toán t nh p đ đ c d li u t dòng cin nh sau:ử ậ ể ọ ữ ệ
cin >> Tham_s ;ố
Trong Tham_s có th là:ố ể
- Bi n ho c ph n t m ng nguyên đ nh n m t s nguyênế ặ ầ ả ể ậ ộ ố
(2)- Bi n ho c ph n t m ng th c đ nh n m t s th cế ặ ầ ả ự ể ậ ộ ố ự
- Bi n ho c ph n t m ng ký t đ nh n m t ký tế ặ ầ ả ự ể ậ ộ ự
- Con tr ký t đ nh n m t d y ký t khác tr ngỏ ự ể ậ ộ ẫ ự ố
Chú ý: Các toán t nh p có th vi t n i đ nh p nhi u giáử ậ ể ế ố ể ậ ề
tr m t dòng l nh nh sau: ị ộ ệ
cin >> Tham_s _1 >> Tham_s _2 >> >> Tham_s _k ;ố ố ố
Cách th c nh p nh sau:ứ ậ ư B qua ký t tr ng (d u cách,ỏ ự ắ ấ
d u tab, d u chuy n dòng) đ ng trấ ấ ể ứ ước n u có sau đ c vàoế ọ
các ký t tự ương ng v i ki u yêu c u C th đ i v i t ng ki uứ ể ầ ụ ể ố ể
nh sau:ư
Khi nh p s nguyên s b qua ký t tr ng đ ng trậ ố ẽ ỏ ự ắ ứ ước n uế
có, sau b t đ u nh n ký t bi u th s nguyên Vi c nh pắ ầ ậ ự ể ị ố ệ ậ
k t thúc g p m t ký t tr ng ho c m t ký t không th hi u làế ặ ộ ự ắ ặ ộ ự ể ể
thành ph n c a s ngun Ví d n u dịng vào (gõ t bànầ ủ ố ụ ế
phím) ch a ký t <space><space>123X2 Tham_s (bênứ ự ố
ph i cin) bi n nguyên n n s nh n giá tr 123 Con tr nh pả ế ẽ ậ ị ỏ ậ
s d ng t i ký t X.ẽ ự
Phép nh p m t s th c ti n hành tậ ộ ố ự ế ương t : B qua cácự ỏ
kho ng tr ng đ ng trả ắ ứ ước n u có, sau b t đ u nh n ký tế ắ ầ ậ ự
bi u th s Th c Vi c nh p k t thúc g p m t ký t tr ngể ị ố ự ệ ậ ế ặ ộ ự ắ
ho c m t ký t không th hi u thành ph n c a s th c.ặ ộ ự ể ể ầ ủ ố ự
Phép nh p m t ký t v y: B qua kho ng tr ng đ ngậ ộ ự ậ ỏ ả ắ ứ
trước n u có, sau nh n m t ký t khác ký t tr ng Ví d n uế ậ ộ ự ự ắ ụ ế
gõ <space><space>XY ký t X đự ược nh n tr nh pậ ỏ ậ
d ng t i ký t Y.ừ ự
Phép nh p m t d y ký t : B qua kho ng tr ng đ ng trậ ộ ẫ ự ỏ ả ắ ứ ước n u có, sau b t đ u nh n t m t ký t khác ký t tr ng Vi cế ắ ầ ậ ộ ự ự ắ ệ
nh p k t thúc g p m t ký t tr ng.ậ ế ặ ộ ự ắ
Ví d 1:ụ Xét đo n chạ ương trình: char ten[10], que[12];
char ch;
int n; float x;
cin >> n >> x >> ch >> ten >> que ; N u gõ ký t :ế ự
123<s>3.14<s><s>ZHONG<s>HAI<s>PHONG<Enter> (đ cho g n s ký hi u <s> <space>)ể ọ ẽ ệ
thì k t qu nh p nh sau:ế ả ậ
n=123 x=3.14 ch=’Z’ ten=”HONG” que = “HAI”
Con tr nh p s d ng t i ký t <space> trỏ ậ ẽ ự ướ ừc t PHONG Các ký t l i s đự ẽ ược nh n câu l nh nh p ti p theo.ậ ệ ậ ế
Ví d 2:ụ Xét đo n chạ ương trình: int m;
float y;
cin >> m >> y; N u gõ:ế
<s><s>456<s><s>4.5<Enter> k t qu nh p là:ế ả ậ
m = 456 y = 4.5
Ký t <Enter> v n l i dịng nh p ự ẫ ậ
§ Nh p ký t chu i ký t t bàn phímậ ự ỗ ự ừ
(3)Chúng ta nh n th y toán t nh p >> ch ti n l i dùng đậ ấ ậ ỉ ệ ợ ể
nh p giá tr s (nguyên, th c) Đ nh p ký t chu i ký tậ ị ố ự ể ậ ự ỗ ự
nên dùng phương th c sau (đ nh nghĩa l p istream):ứ ị
cin.get cin.getline cin.ignore
3.1 Phương th c get có d ngứ ạ (th c ch t có phự ấ ương th
cùng có tên get): D ng 1:ạ
int cin.get() ;
dùng đ đ c m t ký t (k c kho ng tr ng) Cách th c đ c c aể ọ ộ ự ể ả ả ắ ứ ọ ủ
cin.get có th minh ho qua ví d sau: Xét câu l nhể ụ ệ
char ch; ch = cin.get() + N u gõế
ABC<Enter>
thì bi n ch nh n mã ký t A, ký t BC<Enter> l i trênế ậ ự ự
dòng vào + N u gõế
A<Enter>
thì bi n ch nh n mã ký t A, ký t <Enter> l i dòng vào.ế ậ ự ự
+ N u gõế
<Enter>
thì bi n ch nh n mã ký t <Enter> (b ng 10) dòng vào r ng.ế ậ ự ằ ỗ
D ng 2:ạ
istream& cin.get(char &ch) ;
dùng đ đ c m t ký t (k c kho ng tr ng) đ t vào m t bi nể ọ ộ ự ể ả ả ắ ặ ộ ế
ki u char để ược tham chi u b i ch.ế
Chú ý:
+ Cách th c đ c c a cin.get d ng gi ng nh d ng 1ứ ọ ủ ố
+ Do cin.get() d ng tr v tham chi u t i cin, nên có th sạ ả ề ế ể
d ng phụ ương th c get() d ng n i Ví d n uứ ố ụ ế
khai báo
char ch1, ch2; câu l nh:ệ
cin.get(ch1); cin.get(ch2);
có th vi t chung m t câu l nh sau:ể ế ộ ệ
cin.get(ch1).get(ch2); D ng 3:ạ
istream& cin.get(char *str, int n, char delim = ‘\n’);
dùng đ đ c m t d y ký t (k c kho ng tr ng) đ a vào vùngể ọ ộ ẫ ự ể ả ả ắ
nh str tr t i Quá trình đ c k t thúc x y m t 2ớ ỏ ọ ế ẩ ộ
tình hu ng sau:ố
+ G p ký t gi i h n (cho delim) Ký t gi i h n m cặ ự ự ặ
đ nh ‘\n’ (Enter)ị
+ Đã nh n đ (n-1) ký tậ ủ ự
Chú ý:
+ Ký t k t thúc chu i ‘\0’ đự ế ỗ ược b sung vào d y ký t nh nổ ẫ ự ậ
được
+ ký t gi i h n v n l i dòng nh p đ dành cho cácự ẫ ậ ể
l nh nh p ti p theo.ệ ậ ế
Chú ý:
+ Cũng gi ng nh get() d ng 2, có th vi t phố ể ế ương th
get() d ng n i đuôi m t dòng l nh.ạ ố ộ ệ
+ Ký t <Enter> l i dòng nh p có th làm trơi phự ậ ể ương th c get() d ng Ví d xét đo n ụ ương trình:
char ht[25], qq[20], cq[30]; cout << “\nH tên: “ ;ọ
(4)cin.get(ht,25);
cout << “\nQuê quán: “ ; cin.get(qq,20);
cout << “\nC quan: “ ;ơ
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<” “<<cq
Đo n chạ ương trình dùng đ nh p h tên, quê quán c quan.ể ậ ọ
N u gõ:ế
Pham Thu Huong<Enter>
thì câu l nh get đ u tiên s nh n đệ ầ ẽ ậ ược chu i “Pham Thu Huong”ỗ
c t vào m ng ht Ký t <Enter> l i s làm trôi câu l nh getấ ả ự ẽ ệ
ti p theo Do câu l nh cu i s ch in Pham Thu Huong.ế ệ ố ẽ ỉ
Đ kh c ph c tình tr ng trên, có th dùng m t cáchể ắ ụ ể ộ
sau:
+ Dùng phương th c get() d ng ho c d ng đ l y ký tứ ặ ể ấ ự
<Enter> dòng nh p trậ ước dùng get (d ng 3).ạ
+ Dùng phương th c ignore đ l y m t s ký t không c nứ ể ấ ộ ố ự ầ
thi t dòng nh p trế ậ ước dùng get d ng Phạ ương th c nàyứ
vi t nh sau:ế
cin.ignore(n) ; // L y (lo i hay b qua) n ký t ấ ỏ ự
// dòng nh p.ậ
Nh v y đ có th nh p đư ậ ể ể ậ ượ ảc c quê quán c quan, c n s aơ ầ
l i đo n chạ ương trình nh sau:ư
char ht[25], qq[20], cq[30]; cout << “\nH tên: “ ;ọ
cin.get(ht,25);
cin.get(); // Nh n <Enter> ậ
cout << “\nQuê quán: “ ; cin.get(qq,20);
ignore(1); // B qua <Enter>ỏ
cout << “\nC quan: “ ;ơ
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<” “<<cq 3.2 Phương th c getlineứ
Tương t nh get d ng 3, có th dùng getline đ nh p m t d yự ể ể ậ ộ ẫ
ký t t bàn phím Phự ương th c đứ ược mô t nh sau:ả
istream& cin.getline(char *str, int n, char delim = ‘\n’);
Phương th c đ u tiên làm vi c nh get d ng 3, sau lo iứ ầ ệ ạ
<Enter> kh i dòng nh p (ký t <Enter> không đ a vào d y kýỏ ậ ự ẫ
t nh n đự ậ ược) Nh v y có th dùng getline đ nh p nhi u chu iư ậ ể ể ậ ề ố
ký t (mà không lo ng i câu l nh nh p ti p theo b trơi) ự ệ ậ ế ị
Ví dụ đo n chạ ương trình nh p h tên, quê quán c quan bênậ ọ
trên có th vi t nh sau (b ng cách dùng getline):ể ế ằ
char ht[25], qq[20], cq[30]; cout << “\nH tên: “ ;ọ
cin.getline(ht,25); cout << “\nQuê quán: “ ; cin.getline(qq,20); cout << “\nC quan: “ ;ơ
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<” “<<cq
Chú ý: Cũng gi ng nh get() d ng get() d ng 3, có th vi tố ạ ể ế
các phương th c getline() n i m t dịng l nh Ví dứ ố ộ ệ ụ
đo n chạ ương trình có th vi t l i nh sau:ể ế
char ht[25], qq[20], cq[30];
cout << “\nH tên, Quê quán C quan: “ ;ọ
cin.getline(ht,25).getline(qq,20).get(cq,30); cout <<”\n” <<ht<<” “<<qq<<” “<<cq
(5)3.3 Phương th c ignoreứ
Phương th c ignore dùng đ b qua (lo i b ) m t s ký t trênứ ể ỏ ỏ ộ ố ự
dòng nh p Trong nhi u trậ ề ường h p, vi c làm c n thi t đợ ệ ầ ế ể
không làm nh ưởng đ n phép nh p ti p theo ế ậ ế
Phương th c ignore đứ ược mô t nh sau:ả
istream& cin.ignore(int n=1);
Phương th c s b qua (lo i b ) n ký t dòng nh p.ứ ẽ ỏ ỏ ự ậ
3.4 Nh p đ ng th i giá tr s ký tậ ồ ờ ị ố ự
Nh nói §2, tốn t nh p >> bao gi đ l i ký tử ậ ể ự
<Enter> dòng nh p Ký t <Enter> s làm trôi l nhậ ự ẽ ệ
nh p ký t ho c chu i ký t bên dậ ự ặ ỗ ự ưới Do v y c n dùng:ậ ầ
ho c ignore()ặ
ho c get() d ng 1ặ
ho c get() d ng 2ặ
đ lo i b ký t <Enter> cịn sót l i kh i dòng nh p trể ỏ ự ỏ ậ ước th c hi n vi c nh p ký t ho c chu i ký t ự ệ ệ ậ ự ặ ỗ ự
3.5 Ví d :ụ Chương trình s d ng l p TSINH (Thí sinh)ử ụ
v i phớ ương th c xuat nhap ứ
//CT7_04.CPP
// Nh p d liêu s ký tậ ữ ố ự
#include <iostream.h> #include <conio.h> struct TS
{
int sobd; char ht[25]; float dt,dl,dh,td; } ;
class TSINH {
private: TS *ts; int sots; public:
TSINH() {
ts=NULL; sots=0; }
TSINH(int n) {
ts=new TS[n+1]; sots=n;
}
~TSINH() {
if (sots) {
sots=0; ts = NULL; }
}
void nhap(); void xuat(); } ;
(6)void main() {
clrscr();
fstream f("THU.DL",ios::binary | ios::out|ios::in|ios::trunc); TS t1,t2,t3,t4,t5,t6,t;
cin >> t1 >> t2 >> t3; f << t1 << t2 <<t3; f.seekg(0);
f>>t4>>t5>>t6;
cout << t4 << t5 << t6; f.seekg(0);
while( f>>t ,!f.eof() ) cout << t;
f.close();
cout << "\n Xong"; getch();
}
§ 18 H th ng l p streamệ ố ớ
M c h th ng l i l p stream mà s d ngụ ệ ố ụ
bên đ t ch c xu t nh p hình, bàn phím, máy in vàể ổ ứ ấ ậ
t pệ
18.1 S đ quan h gi a l pơ ồ ệ ữ ớ ios
istream fstreambase ostream
ifstream ofstream
fstream 18.2 Các phương th c c a l p iosứ ủ ớ
1 int bad()
2 void clear(int=0) int eof()
4 int fail() int fill() int fill(char) long flags() long flags(long) int good() 10 int precision() 11 int precision(int) 12 long setf(long)
13 long setf(long setbits, long field) 14 long unsetf(long)
15 int width() 16 int width(int)
18.3 Các phương th c c a l p istreamứ ủ ớ operator>>
2 int gcount() int get()
4 istream& get(char*, int, char = ‘\n’)
(7)5 istream& get(char&)
6 istream& getline(char*, int, char = ‘\n’) istream& ignore(int n = 1, int delim = EOF) int peek()
9 istream& putback(char) 10 istream& read(char*, int) 11 istream& seekg(long)
12 istream& seekg(long, seek_dir) 13 long tellg()
18.4 Các phương th c c a l p ostreamứ ủ ớ operator<<
2 ostream& flush() ostream& put(char) ostream& seekp(long)
5 ostream& seekp(long, seek_dir) long tellp()
7 ostream& write(char*, int)
18.5 Các phương th c c a l p fstreambaseứ ủ ớ void close()
18.6 Các phương th c c a l p ifstreamứ ủ ớ ifstream()
2 ifstream(const char*, int = ios::in, int = filebuf::openprot) ifstream(int )
4 ifstream(int , char*, int)
5 void open(const char*, int = ios::in, int = filebuf::openprot) 18.7 Các phương th c c a l p ofstreamứ ủ ớ
1 ofstream()
2 ofstream(const char*, int = ios::out, int = filebuf::openprot) ofstream(int )
4 ofstream(int , char*, int)
5 void open(const char*, int = ios::out, int = filebuf::openprot) 18.8 Các phương th c c a l p fstreamứ ủ ớ
1 fstream()
2 fstream(const char*, int, int = filebuf::openprot) fstream(int )
4 fstream(int , char*, int)
5 void open(const char*, int, int = filebuf::openprot)