xem tệp DSTS (Danh sách thí sinh) đã tôn tại hay không có thê dùng đoạn chương trình:
1fStream fin(“DSTS”); 1ƒ (fin.bad())
{
cout << “\WnTep DSTS không tôn tai”; exI((1);
}
+ Trong quá trình đọc, con trỏ tệp sẽ chuyên dân về cuối tệp. Khi
con trỏ tệp đã ở cuôi tệp (hêt dữ liệu) mà vân thực hiện một lệnh đọc
thì phương thức eof sẽ cho giá trị khác không. Chương trình dưới đây dùng phương thức eof đê xác định độ dài (sô byte) của tệp TC.EXE (chú ý cân dùng kiêu đọc nhị phân):
//CT7 _14.CPP // Do đai tep #include <1ostream.h> #include <fstream.h> #include <comio.h> #include <stdlib.h> void main() { clrscr(); long dd=0; char ch;
1fStream f{”IC.EXE”,los::1n | 1os::binary); 1f (badQ)
Ẳ
couf << ”“WiTep TC.EXE khong ton ta1”:
——~~1_.Z^.
413
kXIUL( 1 7J-
}
while(f.get(ch).!f.eof()) ++dd;
couf << ”\n Do dai TC.EXE: " << dd;
øetchQ); } }
Chương trình dưới đây sẽ:
+ Đọc danh sách thí sinh từ tệp DSI.DL do chương trình trong
muc Ÿ1I tạo ra.
+ In danh sách thí sinh vừa đọc.
+ Sắp xếp dẫy thí sinh (vừa nhập từ tệp) theo thứ tự giảm của tổng
điêm.
+ Ghi danh sách thí sinh sau khi sắp xếp lên tệp DS3.DL + Đọc danh sách thí sinh từ tệp DS3.DL,
+ In danh sách thí sinh đọc từ tệp DS3.DL
Chương trình sử dụng lớp TS (Thí sinh) có 4 phương thức: void xuat();
volid sapxep();
void ghitep(char *t(ep); void doctep(char *ttep); //CT7 12.CPP // Doc tep #include <Iostream.h> #include <Iomanip.h> #include <fstream.h> #include <conmio.h> #include <stdlib.h> 7i°.. _1 1- ~.4 - - T1. 414 SƯUƯUCL I,311NI] { char ht[25]: char ttinh[21 |: Inf sobd; float dt,dl,dh.td; }i class TS { prIvafc: Inf SOfS; TSINH #ts; public: TS0 { sots=0; ts=NULL; } void xuat(; void sapxep();
void ghitep(char *ttep); void doctep(char *ttep);
}
void TS::xuat()
{
couf << "n\nSo thị sinh: " << sofs;
couf << setprecIsion(Ï) << setiosflags(1os::showpoInf);
Ấ Xx. 2x4 —TÍ. 2 7—¬¬4+¬-« | T3
415 \ \
cout << "Thi sinh thu: ” <<1; cout << ”\nHo ten: " << fs[1I[.ht ;
cout << ”\WiTinh - thanh pho: ” << ts[I].ttinh ; couft << "\nSo bao danh: ” << ts[i].sobd ;
<< setw(Š) << fs[i].dt << setw(Š) << fs[¡|.dl << setw(Š) << fs[i|.dh ;
cout << "\nTong diem: ”" << fs[1].td ;
} } }
void TS::sapxepQ
{
Inf n = SOfS;
for (int IF=Ï; 1< n; ++I) for (it JEIt]; J<= n; ++J) 1ƒ (fs[1].td < fs{[J].td) Ẳ TSINH tg = BI]: fS[1] = ts[]]: ts[jJ] = tg: } }
void TS::ghitep(char *ttep)
{
ofstream f;
£.open(ftep,1os::ouf|IOs::noreplace); 1 (.badQ)
416
CVƯỚU >> MIICD œ=¬ LỤCIE >> Wq LƯII LáI .
cout << ”\nCo ghi de? - C/K”: Int ch=getch(); 1ƒ (toupper(ch)—==C) { f.close(Q; f.open(ftep) ; } else exIt(1); } f<< sofS ; f << setprecision(1) << setIosflags(1os::showpoInt); for (int I=l; I<=sofs; ++1)
{
f<< endl << setw(24) << ts[I].ht << setw(20) << fs[I].ttinh ; f << endl << setw(6) << ts[I].sobd
<< setw(6) << fs[i].dt << setw(6) << fs[¡|.dl << setw(6) << tfs[i|.dh << setw(6) << fs[i|.td ; } f.closeQ); }
void TS::doctep(char *ttep) {
1fstream Í;
MU T- TT .- 24 —.-N-
11 (1.U4U(\J)
{
cout << "\nTep ” << ttep << ” khong ton taI”; getchQ);
exit(1); } f>> sofS ; f1Ipnore(); 1ƒ (s!=NULLL) delete ts; ts = new TSINH[sots+Il |; for (int IF=l; I<=sofs; ++1)
{ £.get(fs[i].ht,25).get(ts[i].ttinh,2 1); ; £.get(fs[i].ht,25).get(ts[i].ttinh,2 1); ; f>> ts[1].sobd >> ts[i].dt >> ts[¡].dÌ >>ts[i|.dh >> ts[i].td ; f1Ignore(); } f.close(Q; } void main() 418 { clrscr(); TSt; t.doctep("DS1.DL"); t.xuat(Q); t.sapxepQ; t.ghitep("DS3.DL"); t.doctep("DS3.DL"); t.xuat(Q);
couf << "\n Hoan thanh”;
5 13, Đọc ghi đồng thời trên tệp 13.1. Lớp fstream
Đề đọc ghi đồng thời trên tệp, chúng ta sử dụng lớp fsteam. Lớp fstream thừa kê các phương thức của các lớp ofstream và 1fÍSfream. Ngoài ra lớp fstream có các hàm tạo và phương thức sau:
1. Hàm tạo:
fstream() ; //Không đối
dùng để tạo một đối tượng fštream (dòng nhập-xuất), chưa gắn với tệp.
2. Hàm tạo:
fstream(const char *fn, int mode,
Inf prof = filebuf::openprot);
dùng để tạo một đối tượng fstream, mở tệp có tên fn và găn đôi tượng vừa tạo với tệp được mở.
+ Tham số ñn cho biết tên tệp.
+ Tham số mode quy định các kiểu truy nhập và có thê là tổ hợp của các g1á frỊ sau:
ios::binary đọc-ghi theo kiểu nhị phân (mặc định theo kiểu văn bản).
ios::out ghi tệp, nêu tệp đã có thì nó bị xoá
1Os:1n đọc tỆp
ios::app ghi bổ sung vào cuối tệp
ios::ate chuyển con trỏ tệp về cuối sau khi mở ios::runc xoá nội dung của tệp nêu nó tồn tại
ios::nocreate nếu tệp chưa có thì không làm gì (bỏ qua) ios::noreplace nếu tệp đã có thì không làm gì (bỏ qua)
Chủ Ý°
+ Tham số thứ ba prot quy định cấp bảo vệ của dòng tin, tham số
này có thê bỏ qua vì nó đã được gán một giá trị mặc định. 3. Hàm tạo:
fstream(mt fd);
dùng để tạo một đối tượng fstream và găn nó với một tệp có chỉ số fd đang mở.
(Đề mở và lây chỉ số (số hiệu) tệp có thể dùng hàm _open, xem cuôn Kỹ thuật Lập trình C của tác g1ả)
4. Hàm tạo:
fstream(nt fd, char *buf, inf n);
dùng để tạo một đối tượng fstream , găn nó với một tệp có chỉ số fd
đang mở và sử dùng một vùng nhớ n byte do buf trỏ tới làm bộ đệm. 5. Phương thức:
void open(const char *fn, inf mode, Inf prof = filebuf::openprot);
dùng đề mở tệp có tên fn và găn nó với đối tượng fstream. Các tham sô của phương thức có cùng ý nghĩa như trong hàm tạo thứ 2.
Chư ý: Tham số mode không có giá trị mặc định.
13.2. Các cách đọc-ghi đồng thời trên tệp Có 2 cách chính sau:
+ Cách ï: Dùng hàm tạo 2 để xây dựng một dòng nhập-xuất, mở một tệp để đọc-ghi và gắn tệp với dòng nhập-xuất. Sau đó dùng toán tử nhập >> , toán tử xuất >> và các phương thức nhập, xuất để nhập, xuất dữ liệu ra dùng nhập-xuất vừa tạo (như đối với các dòng chuẩn cin và couf). Ví dụ:
fstream f{“DU_ LIEU”, 1os::1n | 1os::ouf) ;
+ Cách 2: Dùng hàm tạo ] để xây dựng một dòng nhập-xuất. Sau đó dùng phương thức open đê mở một tệp cụ thê (đê đọc và ghi) và cho gãn với dòng nhập-xuât vừa xây dựng. Khi không cân làm việc
420
mọi ràng buộc giữa dòng nhập-xuất và tệp. Sau đó có thể găn dòng nhập-xuât với tệp khác. Theo cách này, có thê dùng một dòng nhập- xuât (đôi tượng fstream) đê đọc-pghi dữ liệu từ nhiêu tệp khác nhau.
Vị dụ: fstream f;
fopen(“DU_ LIEU”, 1os::1n | 1os::ouf) ; 13.3. Di chuyển con trỏ tệp
13.3.1. Để di chuyển con trỏ tệp trên dòng xuất, chúng ta sử dụng các phương thức sau (của lớp ostrean)) :
1. Phương thức
0síreame& seekp(long n) ;
sẽ chuyển con trỏ tệp tới vị trí (byte) thứ n (số thứ tự các byte tính từ 0).
2. Phương thức
0síreame& seekp(long offset, seek_dir dir) ;
sẽ chuyên con trỏ tệp tới vị trí offset kể từ vị trí xuất phát dir. Giá trị của offset có thê âm, còn dir có thê nhận một trong các giá frỊ sau:
ios::beg xuất phát từ đầu tệp ios::end_ xuất phát từ cuối tệp
ioS::cur xuất phát từ vỊ trí hiện tại của con trỏ tệp
3. Phương thức long teelp() ;
cho biết vị trí hiện tại của con trỏ tệp.
13.3.2. Để di chuyển con trỏ tệp trên dòng nhập, chúng ta sử dụng các phương thức sau (của lớp 1stream):
4. Phương thức
Istreame& seekg(long n) ;
sẽ chivên con trỏ tên tới vĩ frí (bvfe) thír n (sô thí tr các bvíe tính
5. Phương thức
Istreame& seeks(long offset, seek_dir dir) ;
sẽ chuyển con trỏ tệp tới vị trí offset kể từ vị trí xuất phát dir. Giá trị của offset có thê âm, còn dir có thê nhận một trong các g1á trỊ sau:
ios::beg xuất phát từ đầu tệp ios:end_ xuất phát từ cuối tệp
ios::cur Xuất phát vị trí hiện tại của con trỏ tệp
6. Phương thức long tcelg0) ;
cho biết vị trí hiện tại của con trỏ tệp.
13.3.3. Đề di chuyển con trồ tệp trên dòng nhập-xuất, chúng ta có thê sử dụng cả 6 phương thức nêu trên.
13.4. Ví dụ