Ghi vào tệp nhị phân bằng write
Các bước thực hiện để ghi dữ liệu vào một tệp nhị phân như sau: 1. Mở tệp tin theo chếđộđể ghi nhị phân bằng đối tượng fstream:
fstream <Tên biến tệp>(<Tên tệp tin>, ios::out|ios::binary);
2. Ghi dữ liệu vào tệp bằng thao tác “write()”:
<Tên biến tệp>.write(char* <Dữ liệu>, int <Kích thước dữ liệu>);
3. Đóng tệp tin bằng lệnh close():
<Tên biến tệp>.close();
Trong đó, thao tác write nhận hai tham sốđầu vào như sau:
• Tham số thứ nhất là con trỏ kiểu char trỏđến vùng dữ liệu cần ghi vào tệp. Vì con trỏ bắt buộc có kiểu char nên khi muốn ghi dữ liệu có kiểu khác vào tệp, ta dùng hàm chuyển kiểu:
reinterpret_cast<char *>(<Dữ liệu>);
• Tham số thứ hai là kích cỡ dữ liệu được ghi vào tệp. Kích cỡ này được tính theo byte, nên thông thường ta dùng toán tử:
sizeof(<Kiểu dữ liệu>);
Lưu ý:
• Khi muốn đọc, ghi các dữ liệu có cấu trúc (struct) vào tệp thì ta phải dùng ở chế độ đọc/ghi tệp nhị phân mà không thể dùng chếđộđọc/ghi ở chếđộ văn bản.
• Khi đọc/ghi dữ liệu có kiểu cấu trúc, để toán tử sizeof() thực hiện chính xác thì các thành viên của cấu trúc không được là kiểu con trỏ. Vì toán tử sizeof() đối với con trỏ chỉ cho kích cỡ của con trỏ mà không cho kích cỡ thật của vùng dữ liệu mà con trỏ trỏ tới.
Chương trình 4.4 minh hoạ việc ghi dữ liệu vào tệp tin nhị phân, dữ liệu là kiểu cấu trúc: • Tên tệp tin và số lượng bản ghi được người dùng tự nhập vào từ bàn phím.
• Chương trình sẽ ghi vào tệp các bản ghi có cấu trúc do người dùng gõ vào từ bàn phím.
Chương trình 4.4 #include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> #include<type.h>
const int length = 25; // Độ dài tối đa tên tệp tin typedef struct {
int day; // Ngày int month; // Tháng
int year; // Năm } Date;
typedef struct {
char name[20]; // Tên nhân viên
Date birthDay; // Ngày sinh của nhân viên char role[20]; // Chức vụ của nhân viên float salary; // Lương của nhân viên } Employee;
void main(){
clrscr();
char fileName[length]; // Tên tệp tin cout << “Ten tep tin: ”;
cin >> setw(length) >> fileName; // Nhập tên tệp tin int recordNumber; // Số lượng bản ghi cout << “So luong ban ghi: ”;
cin >> recordNumber; // Nhập số lượng bản ghi /* Mở tệp tin */
// Khai báo và mở tệp tin
fstream fileOut(fileName, ios::out|ios::binary);
if(!fileOut){ // Không mở được tệp
cout << “Khong the tao duoc tep tin ” << fileName << endl; exit(1);
}
/* Ghi dữ liệu vào tệp tin */ Employee myEmployee;
for(int i=0; i<recordNumber; i++){
cout << “Ban ghi thu ” << i+1 << endl; cout << “Name: ”;
cin >> myEmployee.name; // Nhập tên nhân viên cout << “Day of birth: ”;
cin >> myEmployee.birthDay.day;// Nhập ngày sinh cout << “Month of birth: ”;
cin >> myEmployee.birthDay.month;// Nhập tháng sinh cout << “Year of birth: ”;
cin >> myEmployee.birthDay.year;// Nhập năm sinh cout << “Role: ”;
cin >> myEmployee.role; // Nhập chức vụ cout << “Salary: ”;
cin >> myEmployee.salary; // Nhập tiền lương // Ghi dữ liệu vào tệp fileOut.write(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); } /* Đóng tệp tin */ fileOut.close(); // Đóng tệp tin return; } Đọc dữ liệu từ tệp nhị phân bằng read
Các bước thực hiện đểđọc dữ liệu từ một tệp tin nhị phân như sau:
1. Mở tệp tin theo chếđộđểđọc nhị phân bằng đối tượng fstream (mở tệp tin chỉđể ghi):
fstream <Tên biến tệp>(<Tên tệp tin>, ios::in|ios::binary);
2. Đọc dữ liệu từ tệp bằng thao tác “read()”:
<Tên biến tệp>.read(char* <Dữ liệu ra>, int <Kích thước dữ liệu>);
3. Đóng tệp tin bằng lệnh close():
<Tên biến tệp>.close();
Chương trình 4.5 minh hoạ việc đọc dữ liệu từ tệp tin vào biến có cấu trúc: • Tên tệp tin được người dùng tự nhập vào từ bàn phím.
• Chương trình sẽđọc các cấu trúc nhân viên trong tệp và hiển thị ra màn hình. • Chương trình dừng lại khi kết thúc tệp tin.
Chương trình 4.5 #include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> #include<type.h>
const int length = 25; // Độ dài tối đa tên tệp tin typedef struct {
int day; // Ngày int month; // Tháng int year; // Năm
typedef struct {
char name[20]; // Tên nhân viên
Date birthDay; // Ngày sinh của nhân viên char role[20]; // Chức vụ của nhân viên float salary; // Lương của nhân viên } Employee;
void main(){
clrscr();
char fileName[length]; // Tên tệp tin cout << “Ten tep tin: ”;
cin >> setw(length) >> fileName; // Nhập tên tệp tin /* Mở tệp tin */
// Khai báo và mở tệp tin
fstream fileIn(fileName, ios::in|ios::binary);
if(!fileIn){ // Không mở được tệp
cout << “Khong the mo duoc tep tin ” << fileName << endl; exit(1); } /* Đọc dữ liệu từ tệp tin ra màn hình */ Employee myEmployee; while(fileIn){ fileIn.read(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); // Đọc kí tự từ tệp tin cout << myEmployee.name << “ ” << myEmployee.birthDay.day << “/” << myEmployee.birthDay.month << “/” << myEmployee.birthDay.year << “ ” << myEmployee.role << “ ”
<< myEmployee.salary << endl; // Ghi kí tự ra màn hình }
/* Đóng tệp tin */
fileIn.close(); // Đóng tệp tin return;