Tải bản đầy đủ (.ppt) (34 trang)

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tìm hiểu về vàora với tệp nhị phân (binary file),

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (314.32 KB, 34 trang )

Báo Cáo Bài T p L nậ ớ
L P TRÌNH H NG Đ I T NGẬ ƯỚ Ố ƯỢ
Giảng viên hướng dẫn: Ngô Công Thắng
Nhóm sinh viên thực hiện :(Nhóm 10)
Nguyễn Thị Sen
Nguyễn Thị Diệp
Phạm Ngọc Thắng
Hoàng Thị Nga
Lớp: Tin Học C-k52


Phần 1:Lý Thuyết
A.Tìm hiểu về vào/ra với tệp nhị phân
1.Vào ra t p nh phân b ng read và writeệ ị ằ
2.Ghi m t đ i t ng vào t p nh phânộ ố ượ ệ ị
3.Đ c m t đ i t ng t t p nh phânọ ộ ố ượ ừ ệ ị
B.Kỹ thuật bắt lỗi vào ra tệp
C. Con trỏ tệp
1.Khái ni mệ
2.Toán t l y đ a ch (&).ử ấ ị ỉ
3.Toán t tham chi uử ế
4.Ví dụ
D.Truy nhập trực tiếp vào từng phần tử của tệp
1.Con tr t pỏ ệ
2.Truy nh p v trí hi n t i c a con tr t pậ ị ệ ạ ủ ỏ ệ
3.Ví dụ
Phần 2 :Chương trình
A. Tìm hi u v vào/ra v i t p nh phânể ề ớ ệ ị

Để mở một tệp dưới chế độ nhị phân, ta dùng cú
pháp sau:


fstream <Tên biến tệp> (<Tên tệp>, ios: : binary) ;

Khi đó, các thao tác đọc, ghi trên biến tệp được
thực hiện

Theo đơn vị byte theo kích thước các bản ghi (cấu
trúc) được ghi trong tệp.

Ví dụ: Muốn mở tệp tin baitho.txt dưới chế độ nhị
phân, ta khai báo như sau:
fstream myBaiTho (“baitho.txt”, ios: :binary);
1.Vào ra t p nh phân b ng read và writeệ ị ằ
a. 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:

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 I ế ệ ệ
ios: : binary) ;

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>) ;ướ ữ ệ

Đó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 c nh t: là con tr ki u char tr đ n ố ứ ấ ỏ ể ỏ ế
vùng d li u c n ghi và t p. Vì con tr b t bu c có ữ ệ ầ ệ ỏ ắ ộ
ki u char nên khi mu n ghi d ki 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>) ;ể ữ ệ

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

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: : I ios: :binary) ;ế ệ ệ

Đ 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>) ;ướ ữ ệ

Đóng t p tin b ng l nh close():ệ ằ ệ
<Tên bi n t p>.close( ) ;ế ệ
b. Đ c d li u t t p nh phân b ng ọ ữ ệ ừ ệ ị ằ
read
2. Ghi m t đ i t ng vào t p nh phânộ ố ượ ệ ị
//ghi đoi tuong person ra dia

#include<fstream.h>// cho vao ra file
class person //lop person
{
protected:
char name[40]; //ten nguoi
int age; //tuoi
public:
void getData() //lay du lieu
{
cout<<”\nNhap vao ten:”;cin>>name;
cout<<”\nNhap vao tuoi:”;cin>>age;
}
};
void main()
{
person pers;//tao mot doi tuong person
pers.getData();//lay du lieu cho nguoi
ofstream outfile(“PERSON.DAT”,ios::binary);tao
mot doi tuong ofstream
outfile.write((char*)&pers,sizeof(pers)); //ghirano
}
3.Đ c m t đ i t ng t t p nh phânọ ộ ố ượ ừ ệ ị
//doc doi tuong person tu dia
#include<fstream.h> //cho vao ra file
class person //lop person
{
protected:
char name[40]; //ten nguoi
int age; //tuoi
public:

void showData()//hien thi du lieu
{
cout<<”\nTen:”<<name;
cout<<”\nTuoi:”<<age;
}
};
void main()
{
person pers; //tao mot doi tuong person
ifstream infile(“PERSON.DAT”,ios::binary);//tao
mot doi tuong ifstream
infile.read((char*)&pers,sizeof(pers));//doc no
}
4. Vào ra nhi u đ i t ngề ố ượ
//doc va ghi doi tuong person ra dia
#include<fstream.h> //cho va ra file
Class person //lop person
{
protected:
char name[40]; //ten nguoi
int age; //tuoi
public:
void getData() //lay du lieu
{
cout<<”\nNhap vao ten:”;cin>>name;
cout<<”\nNhap vao tuoi:”;cin>>age;
}
void showData() //hien thi du lieu
{
cout<<”\nTen:”<<name;

cout<<”\nTuoi:”<<age;
}
};
void main()
{
person pers;//tao mot bien person
char ch;
fstream file;//tao mot file vao va ra
//mo de ghi them vao
file.open(“PERSON.DAT’,ios::app | ios::out | ios::in |
ios::binary);
//lay du lieu tu nguoi su dung de ghi ra
//file
do
{
cout<<”\nNhap du lieu cho nguoi:”;
pers.getData();//lay du lieu cua mot nguoi
file.write((char*)&pers,sizeof(pers));//ghi no ra dia
cout<<”Co nhap nua khong(c/k)?”;
cin>>ch;
}
while(ch==’c’);
file.seekg(0); //thiet lap lai de bat dau doc
file.read((char*)&pers,sizeof(pers));
while(!file.eof()) //thoat khi gap cuoi file
{
cout<<”\Nguoi:”; //hien thi
pers.showData();
file.read((char*)&pers,sizeof(pers));//doc nguoi
tiep theo

}
}
B.K thu t b t l i vào/ra t pỹ ậ ắ ỗ ệ

Khi làm vi c v i t p không ph i luôn luôn suôn ệ ớ ệ ả
s ,th ng x y ra m t s tr c tr c, ví d nh :ẻ ườ ả ộ ố ụ ặ ụ ư

M t p đ đ c nh ng t p không t n t iở ệ ể ọ ư ệ ồ ạ

Ghi t p nh ng không gian đĩa đã đ yệ ư ầ

T o t p nh ng đĩa h ng, đĩa c m ghi ho c đĩa ạ ệ ư ỏ ấ ặ
đã đ yầ

Ho c tên t p đ t không h p lặ ệ ặ ợ ệ

S d ng tham s mode ch a chính xác d n t i ử ụ ố ư ẫ ớ
ch ng trình ch y b l i.ươ ạ ị ỗ

Đ c d li u nh ng con tr t p đã cu i t p.ọ ữ ệ ư ỏ ệ ở ố ệ

Tóm lại ,khi làm việc với tệp thường gặp nhiều
lỗi khác nhau, nếu không biết cách phát hiện xử
lý thì chương trình sẽ dẫn đến rối loạn hoặc cho
kết quả sai.

Khái niệm cờ: chứa trong một bit, có 2 trạng
thái:
Bật (on) có giá trị 1
Tắt (off) có giá trị 0

Mỗi stream lưu giữ những cờ trạng thái cho ta
biết thao tác nhập, xuất có thành công hay không,
và nguyên nhân gây lỗi. Các cờ này, cũng như cờ
định dạng, thực chất là các phần tử của 1 vector
bit ( 1 số nguyên ).

Chúng bao gồm :

goodbit: b t khi không có l i x y ra và các c khác ậ ỗ ả ờ
đ u t t.ề ắ

eofbit: b t khi g p end-of-file.ậ ặ

failbit: b t khi vi c nh p tr nên không chính xác ậ ệ ậ ở
nh ng stream v n n. Ví d nh thay vì nh p s ư ẫ ổ ụ ư ậ ố
nguyên thì ng i dùng l i nh p ký t .ườ ạ ậ ự
badbit: b t khi b ng cách nào đó stream b h ng và ậ ằ ị ỏ
m t d li u.ấ ữ ệ

clearbit: đ t l i các c tr ng tháiặ ạ ờ ạ

Các cờ trên có thể được truy xuất thông qua các
hàm tương ứng: good(), eof(), fail(), clear() và
bad()

Ph ng th c :ươ ứ
int eof();

Nếu con trỏ tệp đã ở cuối tệp mà lại thực hiện
lệnh đọc dữ liệu thì phương thức eof() trả về giá

trị khác không,trái lại phương thức có giá trị bằng
không.

Ph ng th c :ươ ứ

int fail();

Ph ng th c fail() tr v giá tr khac không n u ươ ứ ả ề ị ế
l n nh p xu t cu i cùng có l i, trái l i ph ng ầ ậ ấ ố ỗ ạ ươ
th c có giá tr băng 0.ứ ị

Ph ng th c :ươ ứ
int bad();

Ph ng th c bad() tr v m t giá tr khác không ươ ứ ẩ ề ộ ị
khi m t phép nh p xu t không h p l ho c có l i ộ ậ ấ ợ ệ ặ ỗ
mà ch a phát hi n đ c , trái l i ph ng th c có ư ệ ượ ạ ươ ứ
giá tr b ng 0.ị ằ

Ph ng th c :ươ ứ
int good() ;

Ph ng th c good () tr v giá tr khác 0 n u m i ươ ứ ả ề ị ế ọ
vi c đ u t t đ p (không có l i nào x y ra) . Khi ệ ề ố ẹ ỗ ả
có m t lõi nào đó ph ng th c có giá tr b ng 0. ộ ươ ứ ị ằ

Ph ng th c :ươ ứ
void clear();
Dùng đ t t t t c các bit l i.ể ắ ấ ả ỗ


Ví dụ:

Khi mở tệp để đọc cần kiểm tra xem tệp có tồn tại
không. Để làm điều đó chúng ta có thể dùng đoạn
chương trình sau:
char ten_tep[20];
cout<<“\ncho biết tên tệp:”;
cin>>ten_tep;
ifstream f(ten_tep);
if(f.bad())
{
cout<<“\n tệp <<ten_tep<< “không tồn tại”;
exit(1);
}
Ví dụ 2:
Khi tạo tệp mới để ghi cần kiểm tra xem có tạo
được tệp hay không. Để làm điều đó ta có thể
dùng đoạn chương trình sau:
char ten_tep[20];
cout<<“\ncho biết tên tệp:”;
cin>>ten_tep;
ofstream f(ten_tep);
if(f.bad())
{
cout<<“\n không tạo được tẹp <<ten_tep”;
exit(1);
}
C. Con tr t pỏ ệ
1. Khái niệm


Chúng ta đã biết các biến chính là các ô nhớ mà chúng ta có
thể truy xuất dưới các tên. Các biến này được lưu trữ tại
những chỗ cụ thể trong bộ nhớ. Đối với chương trình của
chúng ta, bộ nhớ máy tính chỉ là một dãy gồm các ô nhớ 1
byte, mỗi ô có một địa chỉ xác định.

Vậy con trỏ là biến trỏ tới vùng nhớ chứa thông tin để xác
định các đặc tính của tệp, các thuộc tính này bao gồm: tên,
tình trạng và vị trí hiện thời của con trỏ. Bản chất, con trỏ
tệp xác định một tệp trên đĩa tương ứng với một dòng dữ
liệu và liên kết 2 đốitượng này với nhau
2.Toán t l y đ a ch (&).ử ấ ị ỉ

Toán tử này được dùng để lấy địa chỉ của một biến
VD: ted = &andy;

Giả sử rằng biến andy được đặt ở ô nhớ có địa chỉ
1776 và chúng ta viết như sau:
andy = 25;
fred = andy;
ted = &andy;

Kết quả sẽ giống như trong sơ đồ dưới
đây:
3.Toán t tham chi u (*)ử ế

Bằng cách sử dụng con trỏ chúng ta có thể truy xuất
trực tiếp đến giá trị được lưu trữ trong biến được trỏ
bởi nó bằng cách đặ trước tên biến con trỏ một dấu
sao (*)


VD: beth = *ted;beth sẽ mang giá trị 25, vì ted bằng
1776 và giá trị trỏ bởi 1776 là 25

Khai báo biến kiểu con trỏ

Cú pháp:
Kiểu *tên_biến_con_trỏ
//Dấu sao có nghĩa là trỏ tới
VD:
int * number;
char * character;
float * greatnumber;

Truy nhập biến con trỏ

Đ truy nh p đ n bi n qua con tr ta đ t d u * ể ậ ế ế ỏ ặ ấ
tr c trên bi n con trướ ế ỏ
VD:
Int v;
int *p; // khai báo bi n con tr p tr t i int ế ỏ ỏ ớ

p= &v
v=3;
*p=3; // gán 3 vào v gián ti p qua con tr p;ế ỏ

×