1. 20/06/2010
ĐHSP
Ôn tập xử lý tập tin với
C++
http://fit.hcmup.edu.vn/~tienttt
Cấu trúc
2
20/06/2010
1
2. 20/06/2010
Text file
Dữ liệu trong file được lưu trữ dưới
dạng ASCII.
Ví dụ: chuỗi “AB” và 12 được lưu trữ
trong file và có khoảng trắng giữa
chúng.
3
20/06/2010
Binary file
Dữ liệu được lưu trữ dưới dạng mã
nhị phân.
Lưu trữ dữ liệu dạng cấu trúc, có
kích thước cố định.
Thường dùng để ghi toàn bộ một
struct hay một đối tượng ra file.
4
20/06/2010
2
3. 20/06/2010
Khai báo mở tập tin để ghi dữ liệu
ofstream <tên biến>;
ofstream <tên biến>(<tên file>);
Ví dụ:
ofstream fout;
fout.open(“data.txt”);
hoặc ofstream fout(“data.txt”);
Ghi dữ liệu chuẩn
Tương tự như cout
<tên biến> <toán tử xuất (<<)>
Ví dụ: int a;
fout<<a;
5
20/06/2010
Ghi dữ liệu dạng nhị phân
ostream& write(char* pch,int nCount);
ostream& write(unsigned char* puch,int nCount);
ostream& write(signed char* psch,int nCount);
Giải thích tham số
• pch,puch,psch: con trỏ đến mảng ký tự lưu dữ liệu.
• nCount: số byte cần ghi
6
20/06/2010
3
4. 20/06/2010
Ví dụ
Ghi dữ liệu của 5 phần tử số nguyên liên tiếp ra file dạng nhị phân
---------------------------------------------------------
int a[10];
a[0]=65;a[1]=66;a[2]=97;a[3]=99;a[4]=67;
ofstream fout(“data.txt”);
int n=5;
fout.write((char*)a,n*sizeof(*a));
fout.close();
7
20/06/2010
Mở tập tin để đọc dữ liệu
ifstream <tên biến>;
ifstream <tên biến>(<tên file>);
Ví dụ:
ifstream fin;
fin.open(“data.dat”);
hoặc ifstream fin(“data.dat”);
Đọc dữ liệu chuẩn
Tương tự như cin
<tên biến> <toán tử nhập (>>)>
Ví dụ: int a;
fin>>a;
8
20/06/2010
4
5. 20/06/2010
Đọc dữ liệu dạng nhị phân
istream& read(char* pch, int nCount);
istream& read(unsigned char* puch, int nCount);
istream& read(signed char* psch, int nCount);
Giải thích tham số
pch,puch,psch: con trỏ đến mảng ký tự lưu dữ liệu.
nCount: số byte lớn nhất cần đọc
9
20/06/2010
Ví dụ
Đọc dữ liệu của 5 phần tử số nguyên liên tiếp đã ghi
dạng nhị phân
------------------------------------------------------------int a[10];
ifstream fin(“data.dat”);
int n=5;
fin.read((char*)a,n*sizeof(*a));
fin.close();
10
20/06/2010
5
6. 20/06/2010
Một số thao tác khác với tập tin
Lấy vị trí hiện tại của con trỏ tập tin
Khi đọc
• Dùng hàm tellg();
• Ví dụ: long pos=fin.tellg();
Khi ghi
• Dùng hàm tellp();
• Ví dụ: long pos=fout.tellp();
11
20/06/2010
Một số thao tác khác với tập tin
Di chuyển con trỏ đến một vị trí trong tập tin
Khi đọc
• Dùng hàm seekg(long sobyte, ios::xx vtbd);
• Ví dụ: fin.seekg(0,ios::beg);
//về đầu tập tin
Khi ghi
• Dùng hàm seekp(long sobyte, ios::xx vtbd);
• Ví dụ: fout.seekp(0,ios::end); //đến cuối tập tin
Hằng số
• ios::beg: di chuyển từ đầu tập tin
• ios::cur: di chuyển từ vị trí hiện tại của con trỏ
• ios::end: di chuyển từ cuối tập tin
12
20/06/2010
6
7. 20/06/2010
Ví dụ
Tính kích thước của tập tin
-------------------------------------------long SizeOf(char *fileName)
{
long end,begin;
ifstream myfile(fileName);
begin = myfile.tellg();
myfile.seekg(0, ios::end);
end = myfile.tellg();
myfile.close();
return end-begin;
}
13
20/06/2010
fstream
Sử dụng đối tượng của lớp này có thể vừa
đọc vừa ghi dữ liệu trong cùng một tập tin
is_open(): Trả về true nếu đang mở, false
nếu không mở.
Mở tập tin vừa đọc vừa ghi dạng nhị phân
fstream f;
f.open(“data.dat”,ios::in|ios::out|ios::binar
y);
ios::in, ios::out, ios::app, ios::nocreate, …
14
20/06/2010
7