C++ và Lập trình hướng đối tượng - Chương 7: Các dòng tin (Stream)

C đã cung cấp một thư viện các hàm nhập xuất như printf, scanf, gets, getch(), puts, puch(), fprintf, fscanf, fopen, fwite, fread,. . Các hàm này làm việc khá 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) và đưa ra các 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à lấy (đọc) các byte từ dòng tin (khi đó gọi là dòng nhập - input) vào bộ nhớ. Thao tác xuất là đưa các byte từ bộ nhớ ra dòng tin (khi đó gọi là dong xuất - output). Các thao tác này là độ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úng ta chỉ cần gắn dòng tin với thiết bị này.

 

doc41 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1739 | Lượt tải: 2download
Tóm tắt nội dung C++ và Lập trình hướng đối tượng - Chương 7: Các dòng tin (Stream), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g trình gồm 3 chức năng: 
1. Nhập một danh sách thí sinh mới và ghi vào tệp TS.DL
2. Bổ sung thí sinh vào tệp TS.DL
3. Xem sửa thí sinh trên tệp TS.DL
//CT7_18.CPP
// Doc tep
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
struct TSINH
{
char ht[25];
int sobd;
float td;
};
class TS
{
private:
TSINH ts;
char ten_tep[40];
int sots;
static int size;
public:
TS(char *ttep);
void tao_ds();
void bo_sung();
void xem_sua();
};
int TS::size = sizeof(TSINH);
TS::TS(char *ttep)
{
strcpy(ten_tep,ttep);
fstream f;
f.open(ten_tep,ios::binary|ios::in|ios::ate);
if (!f.good())
sots = 0 ;
else
{
sots=f.tellg()/size ;
}
432	433
}
void TS::tao_ds()
{
fstream f;
f.open(ten_tep,ios::binary|ios::out|ios::noreplace);
if (!f.good())
{
cout << "\nDanh sach da ton tai" ;
cout << "\nCo tao lai khong? - C/K" ;
char ch=getch();
if (toupper(ch) != 'C')
return;
else
{
f.close();
f.open(ten_tep,ios::binary|ios::out|ios::trunc);
}
}
sots=0;
while(1)
{
cout << "\nThi sinh thu: " << (sots+1) ;
cout << "\nHo ten (Bam Enter de ket thuc): ";
fflush(stdin);
gets(ts.ht);
if (ts.ht[0]==0) break;
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
sots++ ;
}
f.close();
}
void TS::bo_sung()
{
fstream f;
f.open(ten_tep,ios::binary|ios::app|ios::nocreate);
if (!f.good())
{
cout << "\nDanh sach chua tao" ;
cout << "\nCo tao moi khong? - C/K" ;
char ch=getch();
if (toupper(ch) != 'C')
return;
else
{
f.close();
f.open(ten_tep,ios::binary|ios::out);
}
}
int stt=0;
while(1)
{
cout << "\nBo sung thi sinh thu: " << (stt+1);
cout << "\nHo ten (Bam Enter de ket thuc): ";
fflush(stdin);
434	435
gets(ts.ht);
if (ts.ht[0]==0) break;
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
++stt;
}
sots += stt ;
f.close();
}
void TS::xem_sua()
{
fstream f; int ch;
f.open(ten_tep,ios::binary|ios::out|ios::in|ios::nocreate);
if (!f.good())
{
cout << "\nDanh sach chua tao" ;
getch();
return ;
}
cout << "\nDanh sach gom: " << sots << "thi sinh" ;
int stt;
while(1)
{
cout << "\nCan xem-sua thi sinh thu (Bam 0 de ket thuc): " ;
cin >> stt ;
if (stt sots) break;
f.seekg((stt-1)*size,ios::beg);
f.read((char*)(&ts),size);
cout << "\nHo ten : " << ts.ht;
cout << "\nSo ba danh: " << ts.sobd ;
cout << "\nTong diem: " << ts.td ;
cout << "\nCo sua khong? - C/K" ;
ch=getch();
if (toupper(ch)=='C')
{
f.seekg(-size,ios::cur) ;
cout << "\nHo ten: ";
fflush(stdin);
gets(ts.ht);
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
}
}
f.close();
}
void main()
{
int chon;
clrscr();
TS t("TS.DL");
while(1)
{
436	437
clrscr();
cout << "\n1. Tao danh sach thi sinh moi" ;
cout << "\n2. Bo sung danh sach thi sinh" ;
cout << "\n3. Xem-sua danh sach thi sinh" ;
cout << "\n4. Ket thuc chuong trinh " ;
chon = getch();
chon = chon - 48;
clrscr();
if (chon==1) t.tao_ds();
else if(chon==2) t.bo_sung();
else if(chon==3) t.xem_sua();
else break;
}
 clrscr();
 cout << "\n Hoan thanh";
 getch();
 }
Đ 17. Xây dựng toán tử nhâp xuất đối tượng trên tệp
Trong các mục trên đã trình bầy cách dùng các toán tử nhập >> và xuất << để ghi dữ liệu kiểu chuẩn (nguyên, thực, ký tự, chuỗi ký tự) trên tệp. Mục này trình bầy cách xây dựng các toán tử dùng để đọc ghi các đối tượng của một lớp bất kỳ do người dùng định nghĩa. 
Giả sử chúng ta muốn sử dụng các toán tử nhập xuất để đọc ghi các đối tượng của lớp TS. Khi đó ta đưa vào các hàm bạn toán tử nhập xuất như sau:
class TS
{
private:
// Khai báo các thuộc tính
public:
friend fstream& operator<<(fstream& fs,const TS &t);
friend fstream& operator>>(fstream& fs,TS &t);
...
} ;
Về kiểu ghi: Có thể xây dựng các toán tử để thực hiện các phép đọc ghi theo kiểu văn bản cũng như nhị phân.
Ví dụ 1: Ghi theo kiểu văn bản
Chương trình dưới đây minh hoạ cách xây dựng và sử dụng các toán tử nhập xuất đối tượng trên màn hình, bàn phím và tệp. Chương trình đưa vào lớp TS (Thí sinh) và các hàm toán tử cho phép nhập xuất các đối tượng TS trên màn hình, bàn phím và tệp. Chương trình gồm các nội dung sau:
+ Tạo tệp TS.DL dùng để đọc và ghi theo kiểu văn bản.
+ Nhập 3 thí sinh từ bàn phím và chứa vào 3 biến đối tượng t1, t2, t3.
+ Ghi nội dung của 3 biến đối tượng t1, t2, t3 lên tệp TS.DL
+ Đọc các đối tượng từ tệp TS.DL và chứa vào 3 biến t4, t5, t6
+ In các biến đối tượng t4, t5, t6 ra màn hình
+ Chuyển con trỏ về đầu tệp, dùng chu trình while để lần lượt đọc các đối tượng từ tệp và in ra màn hình. Dùng phương thức eof để kiểm tra xem đã đọc hết dữ liệu hay chưa.
//CT7_17.CPP
// Cac toan tu doc ghi doi tuong tren Tep
#include 
#include 
#include 
#include 
#include 
438	439
#include 
class TS
{
private:
char ht[25];
float td;
public:
friend ostream& operator<<(ostream& os,const TS &t);
friend istream& operator>>(istream& is,TS &t);
friend fstream& operator<<(fstream& fs,const TS &t);
friend fstream& operator>>(fstream& fs,TS &t);
};
fstream& operator>>(fstream& fs,TS &t)
{
fs.getline(t.ht,25);
fs >> t.td;
fs.ignore();
return fs;
}
ostream& operator<<(ostream& os,const TS &t)
{
os << "\nHo ten: " << t.ht ;
os << "\nTong diem: " << t.td;
return os;
}
fstream& operator<<(fstream& fs,const TS &t)
{
fs << t.ht << endl;
fs << t.td << endl;
return fs;
}
istream& operator>>(istream& is,TS &t)
{
cout << "\nHo ten: " ;
is.get(t.ht,25);
cout << "Tong diem: " ;
is >> t.td ;
is.ignore();
return is;
}
void main()
{
clrscr();
fstream f("TS.DL",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();
}
440	441
Ví dụ 2 : Ghi theo kiểu nhị phân
Chương trình dưới đây cũng có các chức năng như chương trình trong ví dụ 1 bên trên, nhưng cách ghi đọc tệp theo kiểu nhị phân. 
//CT7_19.CPP
// Cac toan tu doc ghi doi tuong tren Tep
// Kieu nhi phan
#include 
#include 
#include 
#include 
#include 
#include 
class TS
{
private:
char ht[25];
float td;
static int size;
public:
friend ostream& operator<<(ostream& os,const TS &t);
friend istream& operator>>(istream& is,TS &t);
friend fstream& operator<<(fstream& fs,const TS &t);
friend fstream& operator>>(fstream& fs,TS &t);
};
int TS::size= sizeof(TS);
fstream& operator>>(fstream& fs,TS &t)
{
fs.read( (char*)(&t) , t.size);
return fs;
}
fstream& operator<<(fstream& fs,const TS &t)
{
fs.write( (char*)(&t) , t.size);
return fs;
}
ostream& operator<<(ostream& os,const TS &t)
{
os << t.ht << endl;
os << t.td << endl;
return os;
}
istream& operator>>(istream& is,TS &t)
{
cout << "\nHo ten: " ;
is.get(t.ht,25);
cout << "Tong diem: " ;
is >> t.td ;
is.ignore();
return is;
}
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;
442	443
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 các lớp stream
Mục này hệ thống lại các lớp stream mà chúng ta đã sử dụng bên trên để tổ chức xuất nhập trên màn hình, bàn phím, máy in và tệp
18.1. Sơ đồ quan hệ giữa các 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)
3. int eof()
4. int fail()
5. int fill()
6. int fill(char)
7. long flags()
8. long flags(long)
9. 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
1. operator>> 
2. int gcount()
3. int get()
4. istream& get(char*, int, char = ‘\n’)
5. istream& get(char&)
6. istream& getline(char*, int, char = ‘\n’)
7. istream& ignore(int n = 1, int delim = EOF)
8. int peek()
9. istream& putback(char)
10. istream& read(char*, int)
11. istream& seekg(long)
12. istream& seekg(long, seek_dir)
13. long tellg()
444	445
18.4. Các phương thức của lớp ostream
1. operator<< 
2. ostream& flush()
3. ostream& put(char)
4. ostream& seekp(long)
5. ostream& seekp(long, seek_dir)
6. 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
1. ifstream()
2. ifstream(const char*, int = ios::in, int = filebuf::openprot)
3. 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)
3. 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)
3. fstream(int )
4. fstream(int , char*, int)
5. void open(const char*, int, int = filebuf::openprot)

File đính kèm:

  • docC++ và Lập trình hướng đối tượng - Chương 7 Các dòng tin (Stream).DOC