. Đọc dữ liệu từ tệp
12.1. Lớp ifstream
Để đọc dữ liệu từ tệp chúng ta sử dụng lớp ifstream. Lớp ifstream thừa kế các phương thức
của các lớp ios và istream. Nó cũng thừa kế phương thức:
close
của lớp fstreambase. Ngoài ra lớp ifstream có thêm các hàm tạo và các phương thức sau:
1. Hàm tạo:
ifstream() ; // Không đối
dùng để tạo một đối tượng ifstream (dòng nhập), chưa gắn với tệp.
2. Hàm tạo:
ifstream(const char *fn, int mode = ios::in,
int prot = filebuf::openprot);
dùng để tạo một đối tượng ifstream, mở tệp có tên fn để đọc và gắn đối tượng vừa tạo với tệp
được mở.
+ Tham số fn cho biết tên tệp.
+ Tham số mode có giá trị mặc định là ios::in (mở để đọc). Tham số này có thể là một hợp
của các giá trị sau:
ios::binary đọc theo kiểu nhị phân (mặc định theo kiểu văn bản)
ios::ate chuyển con trỏ tệp tới cuối tệp sau khi mở tệp
+ 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:
ifstream(int fd);
dùng để tạo một đối tượng ifstream 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 giả)
4. Hàm tạo:
ifstream(int fd, char *buf, int n);
dùng để tạo một đối tượng ifstream , 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:
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
clrscr();
long dd=0; char ch;
ifstream f("TC.EXE",ios::in | ios::binary);
if (f.bad())
{
cout << "\nTep TC.EXE khong ton tai";
getch();
exit(1);
}
while(f.get(ch),!f.eof()) ++dd;
cout << "\n Do dai TC.EXE: " << dd;
getch();
}
412
12.4. Ví dụ
Chương trình dưới đây sẽ:
+ Đọc danh sách thí sinh từ tệp DS1.DL do chương trình trong muc
§
11 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
414
}
void xuat();
void sapxep();
void ghitep(char *ttep);
void doctep(char *ttep);
};
void TS::xuat()
{
cout << "\n\nSo thi sinh: " << sots;
cout << setprecision(1) << setiosflags(ios::showpoint);
for (int i=1; i<=sots; ++i)
{
cout << "\nThi sinh thu: " << i ;
cout << "\nHo ten: " << ts[i].ht ;
cout << "\nTinh - thanh pho: " << ts[i].ttinh ;
cout << "\nSo bao danh: " << ts[i].sobd ;
cout << "\nCac diem toan, ly, hoa: "
<< setw(5) << ts[i].dt
<< setw(5) << ts[i].dl
<< setw(5) << ts[i].dh ;
cout << "\nTong diem: " << ts[i].td ;
}
}
void TS::sapxep()
{
int n = sots;
for (int i=1; i< n; ++i)
for (int j=i+1; j<= n; ++j)
if (ts[i].td < ts[j].td)
<< setw(6) << ts[i].dl
<< setw(6) << ts[i].dh
<< setw(6) << ts[i].td ;
}
f.close();
}
void TS::doctep(char *ttep)
{
ifstream f;
f.open(ttep);
if (f.bad())
{
cout << "\nTep " << ttep << " khong ton tai";
getch();
exit(1);
}
f >> sots ;
f.ignore();
if (ts!=NULL) delete ts;
416