Truy xuát nga u nhie n đén ta p tin là cách thức truy ca ̣p nhanh đén các bản ghi, được sử dụng trong trường hợp cơ sở dư lie ̣u lớn đe truy ca ̣p đén bát kỳ vị tr ́ nào trong file. Dùng đói tượng fstream cho cả đọc và ghi file.
Tương t như thao tác truy uất tuần t . Truy uất ng u nhiên c ng bao g m bốn bước:
Khai báo biến ta ̣p tin truy xuát nga u nhiên ; 1)
Mở ta ̣p tin; 2)
Thực hiện các cơng việc như đọc, ghi, tìm kiếm . . . đối với tệp; 3)
Đóng ta ̣p tin 4)
HAI BÁO TẬP TIN TRUY UẤT NG U NHI N 6.3.1| 6.3.1|
Cú pháp:
fstream fileObject;
Công dụng: Ca u le ̣nh khai báo tạo ra đói tượng file truy ca ̣p nga u nhie n dùng
Tài liệu giảng dạy Trang 67
Ví dụ:
fstream fIOFile; MỞ TẬP TIN TRUY UẤT NG U NHI N 6.3.2|
Cú pháp:
fileObject.open (“filename” , ios::in | ios::out);
Công dụng : tạo lie n két từ đói tượng fileObject vừa tạo ra đén ta ̣p tin
filename trong bo ̣ nhớ máy t ́nh dùng đe đọc và ghi. Filename có the bao gòm
cả đường da n. Néu filename kho ng có sa n th ̀ mo ̣t ta ̣p tin mới se được tạo ra trong thư mục hie ̣n hành hoa ̣c theo đường da n đa ch ̉ ra,.
Ví dụ:
fstream fIOFile;
fIOFile.open(“test.dat”, ios::out );
HÀM G À P 6.3.3| 6.3.3|
Như ta đa biét trong truy xuát ta ̣p tin, có hai luòng truy xuát tuàn tự là luòng nha ̣p (ifstream) và luòng xuát (ofstream). Đói với ifstream con trỏ file có the được gọi là ‘get’ pointer cho ifstream và ‘put’ pointer cho ofstream. fstream có the thực hie ̣n các toán tử cho cả input và output, hơn nư a vừa là “get pointer” vừa là “put pointer”. Có hai hàm dùng đe di chuye n con trỏ các con trỏ đén vị tr ́ mà bạn mong muón trong file là seekg và seekp với các tho ng só tương tự nhau cho cả hai hàm
Cú pháp:
Để ác định vị trí byte th n trong đối tượng file ta viết:
seekg (n); seekp(n);
ới n à s yte v tr mà ần đọc ghi tiếp theo s thực hiện.
V ́ dụ:
o seekg(1000) : đa ̣t con trỏ get tại vị tr ́ byte thứ 1000 cho le n đọc tiép theo.
o seekp(200) : đa ̣t con trỏ put tại vị tr ́ byte thứ 200 cho làn ghi tiép theo.
Tài liệu giảng dạy Trang 68
o Seekp(100 * sizeof(int) – 1) : đa ̣t con trỏ put tại vị tr ́ só nguye n thứ 100
Ta có the dùng toán tử sizeof(object) đe xác định k ́ch thước của các đói tượng. Trong đó object có the là các kie u cơ sở hoạc kie u do người dùng
định ngh a.
V ́ dụ sizeof(int) se cho két quả là 4 bytes trong mo i trường indows. Ta định ngh a kie u dư lie ̣u struct như sau:
struct Student{
char cName[30] ; char xClass[10]; int iAge;
};
Toán tử sizeof(Student) se cho két quả là 44 bytes
Để ác định vị trí byte th n từ một vị trí b t đầu của nó: Seekg (n , direction);
Trong đó direction là hướng tìm kiếm có thể là:
ios::beg (mặc định): để x|c định vị trí liên quan tới phần bắt
đầu(beginning) của một Stream
ios::cur để x|c định vị trí liên quan tới vị trí hiện tại (current)
trong một Stream
ios::end để x|c định vị trí liên quan tới phần kết thúc (ending) của một Stream trong C++.
V ́ dụ:
fInOutFile.seekg(100 , ios::cur ): đa ̣t con trỏ get tại vị tr ́ byte thứ 100 t ́nh từ đàu file.
fInOutFile.seekg(20 , ios::cur ): đa ̣t con trỏ get tại vị tr ́ cách vị tr ́ hie ̣n tai 20 bytes.
fInOutFile.seekg(50 , ios::cur ): đa ̣t con trỏ get tại vị tr ́ byte thứ 50 t ́nh từ cuói file.