Đọc Ghi Dữ Liệu Đồng Thời Trên Tệp Lớp Fstream


sizeof(Employee));

}

/* Đóng tệp tin */ fileOut.close(); // Đóng tệp tin return;

}


5.8. Đọc dữ liệu từ tệp

Các bước thực hiện để đọc dữ liệu từ một tệp tin như sau:

B1. Mở tệp tin theo chề độ để đọc bằng đối tượng ifstream (mở tệp tin chỉ để

đọc):

Có thể bạn quan tâm!

Xem toàn bộ 256 trang tài liệu này.

ifstream <Tên biến tệp>(<Tên tệp tin>, ios::in); B2. Đọc dữ liệu từ tệp bằng thao tác >>:

<Tên biến tệp> >> <biến dữ liệu>; B3. Đóng tệp tin bằng lệnh close():

Lập trình hướng đối tượng - 25

<Tên biến tệp>.close();

Tương tự như toán tử ghi dữ liệu vào tệp, ta cũng có thể định nghĩa chồng toán tử đọc dữ liệu từ tệp (>>) và áp dụng để đọc dữ liệu từ một tệp tin có tên được nhập từ bàn phím như sau:

Ví dụ 5.7:

#include<iostream.h>

#include<conio.h>

#include<string.h>

#include<fstream.h> class ts

{

char sbd[5]; char ten[30];

unsigned int diem; public:

friend ostream &operator<<(ostream &os, const ts &t)

{

cout<<"nSo bao danh:"<<t.sbd;


cout<<"nHo va ten:"<<t.ten; cout<<"nTong diem:"<<t.diem; return os;

}

friend istream &operator>>(istream &is,ts &t)

{

cout<<"So bao danh:"; is.getline(t.sbd,5); cout<<"Ho va ten:"; is.getline(t.ten,30); cout<<"Tong diem:"; is>>t.diem; is.ignore();

return is;

}

friend ofstream &operator<<(ofstream &fs, const ts &t)

{

fs<<t.sbd<<endl; fs<<t.ten<<endl; fs<<t.diem<<endl; return fs;

}

friend ifstream &operator>>(ifstream &fs,ts &t)

{

fs.getline(t.sbd,5); fs.getline(t.ten,30); fs>>t.diem; fs.ignore();

return fs;

}

};

void main()

{


char filename[20]; int i,n;

ts x;

cout<<"Nhap so thi sinh n ="; cin>>n;

cin.ignore(1); cout<<"Nhap ten tep:"; cin.getline(filename,20);

ofstream f(filename,ios::out | ios::trunc); for(i=1;i<=n;i++)

{

cout<<"Nhap thong tin ve thi sinh thu "<<i<<":n"; cin>>x;

f<<x;

}

f.close();

ifstream g(filename,ios::in | ios::trunc); while(g>>x,!g.eof())

cout<<x; g.close();

getch();

}

Đọc dữ liệu từ một tệp tin nhị phân

Để đọc dữ liệu từ một tệp nhị phân, ta thực hiện các bước sau:

B1. 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); B2. Đọc dữ liệu từ tệp bằng lệnh read()

<Tên biến tệp>.read(char* <Dữ liệu ra>, int <Kích thước dữ liệu>); B3. Đóng tệp tin bằng lệnh close():

<Tên biến tệp>.close();

Chương trình sau 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.

Ví dụ 5.8:

#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

/* 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;

}


5.9. Đọc ghi dữ liệu đồng thời trên tệp Lớp fstream

Để đọc ghi đồng thời trên tệp, chúng ta sử dụng lớp fstream. Lớp fstream thừa kế các phương thức cđa các lớp ofstream và ifstream. Ngoài ra, lớp fstream có các hàm tạo và phương thức sau:

Hàm tạo:

fstream() ;

dùng để tạo một đối tượng fstream (dòng nhập-xuất), chưa gắn với tệp.

Hàm tạo:

fstream(const char *fn, int mode,

int prot = filebuf::openprot);


dùng để tạo một đối tượng fstream, mở tệp có tên fn và gắn đối tượng vũa tạo với tệp được mở. Trong đó :

+ Tham số fn cho biết tên tệp.

+ Tham số mode quy định các kiểu truy nhập và có thể là tổ hợp cđa các giá trị sau:

ios::binary đọc-ghi theo kiểu nhị phân (mặc định theo kiểu văn bản). ios::out ghi tệp, nếu tệp đã có thì nó bị xoá

ios::in đọc tệp

ios::app ghi bổ sung vào cuối tệp

ios::ate chuyển con trỏ tệp về cuối sau khi mở ios::trunc xoá nội dung cđa tệp nếu nó tồn tạI ios::nocreate nếu tệp chưa có thì không làm gì (bỏ qua) ios::noreplace nếu tệp đã có thì không làm gì (bỏ qua)

Chú ý:

+ Tham số mode không có giá trị mặc định.

+ Tham số thứ ba prot quy định cấp bảo vệ cđa dòng tin, tham số này có thể bỏ qua vì nó đã được gán một giá trị mặc định.

Hàm tạo:

fstream(int fd);

dùng để tạo một đối tượng fstream và gắn nó với một tệp có chỉ số fd đang mở.

Hàm tạo:

fstream(int fd, char *buf, int n);

dùng để tạo một đối tượng fstream , gắn nó với một tệp có chỉ số fd đang mở và sử dùng một vùng nhớ n byte do buf trỏ tới làm bộ đệm.

Phương thức:

void open(const char *fn, int mode,

int prot = filebuf::openprot);

dùng để mở tệp có tên fn và gắn nó với đối tượng fstream. Các tham số cđa phương thức có cùng ý nghĩa như trong hàm tạo thứ 2.


Chú ý: Tham số mode không có giá trị mặc định.


Các cách đọc-ghi đồng thời trên tệp

Có 2 cách chính sau:

Cách 1: Dùng hàm tạo 2 để xây dựng một dòng nhập-xuất, mở một tệp để

đọc-ghi và gắn tệp với dòng nhập-xuất. Sau đó dùng toán tử nhập >>, toán tử xuất >> và các phương thức nhập, xuất để nhập, xuất dữ liệu ra dùng nhập-xuất vũa tạo (như đối với các dòng chuẩn cin và cout). Ví dụ:

fstream f(DU_LIEU, ios::in | ios::out) ;

Cách 2: Dùng hàm tạo 1 để xây dựng một dòng nhập-xuất. Sau đó dùng phương thức open để mở một tệp cụ thể (để đọc và ghi) và cho gắn với dòng nhập-xuất vũa xây dựng. Khi không cần làm việc với tệp này nữa, chúng ta có thể dùng phương thức close để chấm dứt mọi ràng buộc giữa dòng nhập-xuất và tệp. Sau đó có thể gắn dòng nhập-xuất với tệp khác. Theo cách này, có thể dùng một dòng nhập-xuất (đối tượng fstream) để

đọc-ghi dữ liệu từ nhiều tệp khác nhau. Ví dụ: fstream f;

f.open(DU_LIEU, ios::in | ios::out) ;

Ta có thể định nghĩa chồng toán tử nhập (>>), xuất (<<) cho lớp fstream và mở tệp đồng thời cho việc nhập/xuất dữ liệu như trong ví dụ sau:

Ví dụ 5.9:

#include<iostream.h>

#include<conio.h>

#include<string.h>

#include<fstream.h> class ts

{

char sbd[5]; char ten[30];

unsigned int diem; public:

friend ostream &operator<<(ostream &os, const ts &t)


{

cout<<"nSo bao danh:"<<t.sbd; cout<<"nHo va ten:"<<t.ten; cout<<"nTong diem:"<<t.diem; return os;

}

friend istream &operator>>(istream &is,ts &t)

{

cout<<"So bao danh:"; is.getline(t.sbd,5); cout<<"Ho va ten:"; is.getline(t.ten,30); cout<<"Tong diem:"; is>>t.diem; is.ignore();

return is;

}

friend fstream &operator<<(fstream &fs, const ts &t)

{

fs<<t.sbd<<endl; fs<<t.ten<<endl; fs<<t.diem<<endl; return fs;

}

friend fstream &operator>>(fstream &fs,ts &t)

{

fs.getline(t.sbd,5); fs.getline(t.ten,30); fs>>t.diem; fs.ignore();

return fs;

}

};

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 03/07/2022