Yêu cầu mọi thông tin sao chép từ blog này phải được ghi rõ đầy đủ: Thông tin được sao chép từ "http://www.dangngochoangthanh.blogspot.com".

Cool wallpaper http://www.fancymessage.com

EMOJI KEYBOARD PRO http://emojiselector.com

THƯ VIỆN HÌNH ĐỘNG FLASH ANIMATION: http://flashanimationlibrary.blogspot.ru/

Hệ thống học trực tuyến đang được phát triển và sẽ đưa vào sử dụng vào cuối năm nay. Hãy xem qua một số demo của Học Trực Tuyến.


HỌC TRỰC TUYẾN ĐÃ CUNG CẤP PHIÊN BẢN TRUY CẬP QUA MOBILE http://dangngochoangthanh.blogspot.com/?m=1

XEM KÊNH HỌC TRỰC TUYẾN TRÊN YOUTUBE



Search on This Blog

Saturday, September 11, 2010

File nhị phân và Đồng bộ hóa

File nhị phân
Đối với file nhị phân, việc đọc ghi dữ liệu bằng toán tử tích trách >> và toán tử chèn << cũng như hàm getline là không có hiệu lực, bởi chúng không được định dạng theo kiểu văn bản như đối với file văn bản ở trên (không dùng phím space để tạo khoảng cách, không có kí tự xuống dòng…).
Các luồng của file gồm hai hàm thành viên để đọc và ghi dữ liệu là read và write. Hàm thành viên write là hàm thành viên của lớp ostream thừa kế từ ofstream. Và hàm read là thành viên của lớp istream thừa kế từ ifstream. Các đối tượng của lớp fstream có cả hai hàm thành viên này. Chúng có prototype như sau:
write(khối_bộ_nhớ, kích_thước);
read(khối_bộ_nhớ, kích_thước);

Ở đó, khối_bộ_nhớ là một con trỏ kiểu char (char*) và nó biểu diễn địa chỉ của một mảng các byte mà nó đọc được hoặc ghi. Biến kích_thước là một kiểu số nguyên integer, nó chỉ định số các kí tự có thể đọc/ghi lên khối bộ nhớ. Bạn có thể quan sát ví dụ sau đây
Ví dụ
#include
#include
using namespace std;
ifstream::pos_type size;
char* memblock;
int main(){
ifstream file(“example.bin”, ios::in|ios::binary|ios::ate);
if(file.is_open()){
size = file.tellg();
memblock = new char[size];
file.seekg(0, ios::beg);
file.read(memblock, size);
file.close();
cout<<”Hoan tat !”;
//Làm việc với dữ liệu trong con trỏ memblock
delete[] memblock;
}
else cout<<”Khong mo duoc file.”;
return 0;
}
Giải thích: trong chương trình, ta mở file example.bin. Chế độ mở file để đọc (ios::in), theo kiểu file nhị phần (ios::binary), đặt con trỏ get vào cuối file (ios::ate). Sau khi mở file, hàm file.tellg() sẽ cho biết kích thước thực của file. Sau đó hàm file.seekg sẽ đặt vị trí con trỏ get vào đầu file (vị trí 0 kể từ vị trí đầu tiên) và tiến hành đọc theo khối bộ nhờ nhờ vào file.read. Sau khi hoàn tất, phương thức close được triệu gọi để kết thúc việc đọc file. Khi đó, dữ liệu từ file đã đọc vào mảng memblock. Bạn có thể bổ sung tác vụ thao tác với dữ liệu nếu muốn. Cuối cùng, con trỏ memblock sẽ bị xóa để giải phóng bộ nhớ.

Bộ đệm và Đồng bộ hóa
Khi thực thi các tác vụ đọc/ghi dữ liệu với file, chúng ta thực thi như trên nhưng thông qua một bộ đệm có kiểu dữ liệu streambuf. Bộ đệm này là một khối bộ nhớ đóng vai trò trung gian giữa các luồng và file vật lý. Ví dụ, với ofstream, mỗi thời điểm hàm put được gọi, kí tự không ghi trực tiếp lên file mà nó sẽ được ghi lên bộ đệm. Khi bộ đệm đầy, mọi dữ liệu chứa trong đó sẽ được ghi lên file (nếu đó là luồng ghi dữ liệu) hay xóa bỏ để làm rãnh bộ nhớ (nếu đó là luồng đọc dữ liệu). Tiến trình này được gọi là đồng bộ hóa và có các tình huống sau đây:
- Khi file đã đóng: trước khi đóng một file, tất cả dữ liệu trong bộ nhớ nếu chưa đầy vẫn được đồng bộ và chuẩn bị để đọc/ghi lên file.
- Khi bộ nhớ đầy: bộ đệm có kích thước giới hạn. Khi nó đầy, nó sẽ tự động đồng bộ hóa.
- Bộ điều phối: khi các bộ điều phối được sử dụng trên luồng, một tiến trình đồng bộ dứt điểm sẽ được diễn ra. Những bộ điều phối này bao gồm: flush và endl.
- Hàm thành viên sync(): nếu hàm thành viên sync() được triệu gọi, tiến trình đồng bộ hóa sẽ diễn ra. Hàm này trả về một kiểu integer (int) tương ứng với -1, nếu luồng không có bộ đệm liên kết hoặc trong trường hợp đọc/ghi thất bại. Ngược lại, nó sẽ trả về giá trị 0.

No comments:

Post a Comment