2.1. Đối với file nhị phân
2.2.1.Định nghĩa :
File nhị phân là file chứa nội dung không nhất thiết phải là ASCII text.
Xét ví dụ sau :
ofstream file("num.dat");
short x = 1297;
file << x;
Dòng lệnh cuối cùng của ví dụ trên sẽ ghi nội dung của x vào file. Và chúng được lưu vào ở dạng kí tự '1', '2', '9', '7'.
Thực sự là con số 1297 không hề được lưu trong bộ nhớ. Nó đã được định dạng thành 1 số nhị phân, và chiếm 2 byte trong bộ nhớ máy tính.
Vì x kiểu short nó sẽ được lưu như sau :
00000101 | 00010001
Và đây chính là dữ liệu nguyên thuỷ được lưu trong bộ nhớ. Để làm được như vậy chúng ta sẽ có cú pháp như sau :
file.open("stuff.dat", ios::out | ios::binary);
2.2.2.Vào/ ra trên file nhị phân
Vào ra tệp tin nhị phân bằng: read và write
a.Write
-Hàm write dùng để ghi 1 file stream ở định dạng nhị nhận. Dạng tổng quát của hàm write như sau :
fileObject.write(address, size);
Lưu ý :
-fileObject là tên của đối tượng file stream.
-address là địa chỉ đầu tiên của 1 vùng nhớ được ghi vào file. Đối số này có thể là địa chỉ của 1 kí tự hoặc là con trỏ tới kiểu char.
-size là số lượng byte của vùng nhớ mà nó được write. Đối số này bắt buộc phải là kiểu integer( số nguyên dương )
Ví dụ :
char letter = 'A';
file.write(&letter, sizeof(letter));
-Đối thứ nhất ở đây là địa chỉ của biến letter. Và đối này sẽ nói cho hàm write biết rằng dữ liệu được ghi vào file ở đâu trong vùng nhớ.
-Đối thứ 2 sẽ là kíck thước của biến letter, và đối này sẽ nói cho hàm write biết số lượng byte của dữ liệu sẽ ghi vào file. Bởi vì dữ sẽ được lưu khác nhau trên tuỳ hệ thống khác nhau, nên cách tốt nhất là chúng ta dùng toán tử sizeof để quyết định số bytes được ghi. Và sau khi hàm này được thực hiện, nội dung của biến letter sẽ được khi vào file nhị phân của đối tượng "file"đó.
Chúng ta xem tiếp 1 ví dụ khác
char data[] = {'A', 'B', 'C', 'D'};
file.write(data, sizeof(data));
Trong ví dụ này thì đối thứ 1 là tên của mãng (data). Vì khi ta truyền tham số là tên của mãng thì tức là ta đã truyền con trỏ trỏ tới vị trí đầu tiên của mãng. Đối thứ 2 cũng có ý nghĩa tượng tự như ví dụ 1. Và sau khi gặp này thực hiện thì nội dung của mãng sẽ được ghi vào file nhị phân tương ứng với đối tượng file.
b.Read:
Hàm read thì sẽ dùng đọc vào số dữ liệu nhị phân từ file vào bộ nhớ máy tính. Dạng tổng quát là :
fileObject.read(address, size);
-Ở đây fileObject là tên của đối tượng file stream.
-address là địa chỉ đầu tiên mà vùng nhớ mà dữ liệu được đọc vào được lưu. Và đối này có thể là địa chỉ của 1 kí tự hay 1 con trỏ tới kiểu char.
-size cũng là số lượng byte trong bộ nhớ được đọc vào từ file. Và đối này bắt buộc cũng phải là số kiểu integer ( nguyên dương )
Ví dụ :
char letter;
file.read(&letter, sizeof(letter));
Hoặc :
char data[4];
file.read(data, sizeof(data));
Chương trình sau sẽ minh hoạ cách sử dụng 2 hàm read and write :
// Ghi các nội dung của mảng vào tập tin.
cout << "Viết các ký tự để các tập tin. \ n";
file.write (dữ liệu, sizeof (dữ liệu));
// Đóng tệp.
file.close ();
// Mở file cho đầu vào trong chế độ nhị phân.
file.open ("test.dat", ios :: in | ios :: binary);
// Đọc nội dung của tập tin vào mảng.
cout << "Bây giờ đọc lại dữ liệu vào bộ nhớ. \ n";
file.read (dữ liệu, sizeof (dữ liệu));
// Hiển thị nội dung của mảng.
for (int count = 0; count <SIZE; đếm ++)
cout << dữ liệu [count] << "";
cout << endl;
// Đóng tệp.
file.close ();
return 0;
}
Nếu chúng ta muốn ghi các kiểu khác vào file nhị phân thì ta phải dùng cú pháp có 1 tí đặt biệt sau đây.
reinterpret_cast<dataType>(value)
Ở cú pháp trên thì dataType sẽ là kiểu dữ liệu mà chúng ta muốn ép về, và value sẽ là giá trị mà chúng ta muốn ép.
Ví dụ :
int x = 65;
file.write(reinterpret_cast<char *>(&x), sizeof(x));
Đối với mảng thì :
const int SIZE = 10;
int numbers[SIZE] = {1,2,3,4,5,6,7,8,9,10};
file.write(reinterpret_cast<charr *>(numbers), sizeof(numbers));
Ví dụ :
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const int SIZE = 10;
fstream file;
int numbers[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Open the file for output in binary mode.
file.open("numbers.dat", ios::out | ios::binary);
// Write the contents of the array to the file.
cout << "Writing the data to the file.\n";
file.write(reinterpret_cast<char *>(numbers), sizeof(numbers));
// Close the file.
file.close();
// Open the file for input in binary mode.
file.open("numbers.dat", ios::in | ios::binary);
// Read the contents of the file into the array.
cout << "Now reading the data back into memory.\n";
file.read(reinterpret_cast<char *>(numbers), sizeof(numbers));
// Display the contents of the array.
for (int count = 0; count < SIZE; count++)
cout << numbers[count] << " ";
cout << endl;
// Close the file.
file.close();
return 0;
}
» Tin mới nhất:
» Các tin khác: