1. Trang chủ
  2. » Công Nghệ Thông Tin

Đọc và ghi trên luồng và tệp

47 308 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 47
Dung lượng 350,79 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

N ối vào một tệp• Thao tác mở tệp chuẩn bắt đầu với tệp rỗng – N ếu tệp có dữ liệu trước khi mở thì toàn bộ dữ liệu sẽ bị xóa • Mở để ghi nối: ofstream outStream; outStream.open"importan

Trang 1

Bài 12: Đọc/ghi trên

Gi ảng viên: Hoàng Thị Điệp Khoa Công ngh ệ Thông tin – ĐH Công Nghệ

Trang 2

Thu ật ngữ

• stream: dòng tin / dòng / luồng

• input stream: luồng nhập

• output stream: luồng xuất

• standard input stream: luồng nhập chuẩn == bàn phím

• standard output stream: luồng xuất chuẩn == màn hình

• file: tệp

• text file: tệp văn bản

• binary file: tệp nhị phân

Trang 3

Chapter 12

Streams

and File I/O

Copyright © 2010 Pearson Addison-Wesley All rights reserved

Trang 4

– Sơ lược về khái niệm thừa kế

• Phương thức truy cập ngẫu nhiên trên tệp

Trang 5

Gi ới thiệu

• Luồng

– Các đối tượng đặc biệt

– Chuy ển phát input và output của chương trình

• Đọc/ghi trên tệp

– S ử dụng khái niệm thừa kế

• Gi ới thiệu ở chương 14 giáo trình – Đọc/ghi trên tệp rất hữu ích

• Được giới thiệu ở bài này

INT2202 DTH

Trang 7

– Hướng tới hoặc xuất phát từ tệp

– Dùng tương tự như cin, cout

INT2202 DTH

Trang 8

S ử dụng luồng giống cách dùng cin, cout

outStream << "theNumber is " << theNumber;

• Ghi giá tr ị vào luồng, từ đó sẽ đi vào tệp

Trang 9

– Khi chương trình truyền output ra

• Bắt đầu từ đầu tệp tới cuối tệp

– C++ có nh ững phương thức đọc/ghi khác

– Nhưng ở đây ta chỉ bàn về những phương thức đơn giản trên

t ệp văn bản

INT2202 DTH

Trang 10

– Định nghĩa trong thư viện <fstream>

– Đặt tên trong không gian tên std

Trang 11

Thư viện đọc/ghi tệp

• Để cho phép cả đọc tệp và ghi tệp trong chương trình:

Trang 13

S ử dụng luồng

• Sau khi khai báo ta có thể sử dụng nó

int oneNumber, anotherNumber;

inStream >> oneNumber >> anotherNumber;

• Tương tự với luồng xuất:

Trang 14

• Đôi khi được gọi là tên tệp thực sự

• Ch ỉ dùng 1 lần duy nhất trong chương trình (để mở tệp)

– Tên lu ồng

• Còn g ọi là tên tệp logic

• Chương trình dùng tên này cho tất cả các hoạt động trên tệp

Trang 16

flush cho t ệp

• Dữ liệu xuất thường được "buffered"

– Lưu lại tạm thời trước khi ghi vào tệp

Trang 17

Ví d ụ tệp:

Display 12.1 Đọc/ghi đơn giản trên tệp (1/2)

INT2202 DTH

Trang 18

Ví d ụ tệp:

Display 12.1 Đọc/ghi đơn giản trên tệp (2/2)

Trang 19

N ối vào một tệp

• Thao tác mở tệp chuẩn bắt đầu với tệp rỗng

– N ếu tệp có dữ liệu trước khi mở thì toàn bộ dữ liệu sẽ bị xóa

• Mở để ghi nối:

ofstream outStream;

outStream.open("important.txt", ios::app);

– N ếu tệp không tồn tại  tạo tệp

– N ếu tệp tồn tại  ghi nối vào cuối tệp

– Đối số thứ 2 là hằng định nghĩa sẵn cho lớp ios

• Trong thư viện <iostream>, không gian tên std

INT2202 DTH

Trang 20

Cú pháp khác để mở tệp

• Có thể chỉ định tên tệp khi khai báo

– Truyền đối số (là tên tệp) cho hàm kiến tạo

• ifstream inStream;

inStream.open("infile.txt");

tương đương với:

ifstream inStream("infile.txt");

Trang 21

Ki ểm tra mở tệp thành công

• Thao tác mở tệp có thể thất bại

– n ếu tệp mở để đọc không tồn tại, hoặc

– không có quy ền ghi vào tệp xuất

– K ết quả không lường trước được

Trang 23

cout << next;

inStream.get(next);

}

• Đọc từng kí tự tới khi đến cuối tệp

• Hàm thành viên eof() tr ả về giá trị bool

INT2202 DTH

Trang 24

Ki ểm tra cuối tệp (2/2)

2 Dùng chính l ệnh đọc

– Thao tác đọc trả về giá trị bool

(inStream >> next)

• Bi ểu thức trả về true nếu đọc thành công

• Tr ả về false nếu lệnh đọc vượt khỏi điểm cuối tệp – Ví d ụ:

double next, sum = 0;

while (inStream >> next)

sum = sum + next;

cout << "the sum is " << sum << endl;

Trang 25

Công c ụ: Tên tệp

• Thao tác m ở luồng

void open(const char * filename, ios_base:openmode mode = ios_base::in);

– Đối số của hàm open() có kiểu xâu C

– Có th ể là giá trị hằng (như ta làm trong các ví dụ trước) hoặc

Trang 26

Định dạng dữ liệu xuất

b ằng hàm thành viên của luồng

• “Công thức màu nhiệm” trong chương 1:

cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(2);

• Định dạng in số tới 2 chữ số sau dấu phẩy (12.52)

• Có thể dùng cho bất cứ luồng xuất nào

– Lu ồng tệp cũng có các hàm thành viên giống hệt đối tượng cout

Trang 27

Hàm thành viên c ủa luồng xuất

Trang 28

Hàm thành viên c ủa luồng xuất

• Xét:

outStream.width(5);

• Hàm thành viên width(x)

– Đặt độ rộng cột là x cho giá trị xuất

– Ch ỉ có tác dụng trên giá trị xuất ngay sau đó

– N ếu muốn tất cả các giá trị xuất đều được in với độ rộng cột là x thì ph ải gọi tới width cho mỗi giá trị

• Thường thì dữ liệu xuất có độ rộng cột khác nhau

Trang 29

C ờ

• Hàm thành viên setf()

– Thiết lập giá trị logic trên các cờ xuất

• Tất cả các luồng xuất đều có thành viên setf()

• Cờ là hằng trong lớp ios

– Trong thư viện <iostream>, không gian tên std

INT2202 DTH

Trang 31

• Manipulator được định nghĩa là

“một hàm được gọi khác cách truyền thống”

Trang 34

Lưu lại thiết đặt cờ

• Giá trị thiết lập cho các cờ định dạng sẽ không đổi nếu

bạn không chỉ định tường minh

• Các cờ precision và setf có thể được lưu lại để khôi

Trang 35

Ví d ụ: lưu lại thiết đặt cờ

• void outputStuff(ofstream& outStream)

{

int precisionSetting = outStream.precision();

long flagSettings = outStream.flags();

Trang 36

Khôi ph ục thiết đặt setf mặc định

• Ta cũng có thể khôi phục các thiết đặt mặc định:

cout.setf(0, ios::floatfield);

• Không nhất thiết phải là định dạng “mới nhất”!

• Các giá trị mặc định này phụ thuộc vào cài đặt

• Lệnh này không khôi phục precision mặc định

Trang 37

Phân c ấp luồng

• Mối quan hệ giữa các lớp

– “D ẫn xuất từ"

• M ột lớp phát triển từ một lớp khác

• Các đặc tính riêng được bổ sung

– Ví d ụ: Lớp biểu diễn tam giác dẫn xuất từ lớp biểu diễn đa giác – Ví d ụ: Lớp biểu diễn luồng nhập từ tệp dẫn xuất từ lớp biểu diễn

lu ồng nhập

• Sau đó nó bổ sung hàm thành viên open và close

– T ức là ifstream dẫn xuất từ istream

INT2202 DTH

Trang 38

Ví d ụ thực tế của thừa kế lớp

• Lớp biểu diễn xe máy tay ga dẫn xuất từ lớp biểu diễn

xe máy

– Mỗi xe máy tay ga là một xe máy

– Xe máy tay ga “bổ sung các đặc tính” cho xe máy

Trang 39

Quan h ệ thừa kế

gi ữa các lớp biểu diễn luồng

• Nếu D dẫn xuất từ B 

– Tất cả các đối tượng kiểu D cũng có kiểu B

– Ví dụ: một xe máy tay ga là một xe máy

Trang 40

Ví d ụ: Quan hệ thừa kế

gi ữa các lớp biểu diễn luồng

Trang 42

Truy c ập ngẫu nhiên vào tệp

• Truy cập tuần tự

– là phương thức truy cập thông dụng nhất

• Truy cập ngẫu nhiên

– Truy cập nhanh tới các bản ghi

– Có thể trong cơ sở dữ liệu rất lớn

– Truy cập ngẫu nhiên tới bất cứ vị trí nào trong tệp

– Dùng đối tượng fstream

• cả nhập và xuất

Trang 43

Công c ụ truy cập ngẫu nhiên

• Thao tác mở giống như istream hay ostream

– Thêm đối số thứ 2

– fstream rwStream;

rwStream.open("stuff.dat", ios::in | ios:: out);

• M ở tệp có tên là stuff.dat để đọc và ghi

Trang 44

Kích c ỡ truy cập ngẫu nhiên

• Để có thể di chuyển  ta cần biết kích cỡ

– toán t ử sizeof() xác định số byte cần cho mỗi đối tượng:

sizeof(s) // trong đó s là biến string s = "Hello"

Trang 45

Tóm t ắt 1

• Luồng kết nối với tệp nhờ thao tác mở tệp

• Hàm thành viên fail() kiểm tra xem thao tác mở tệp

thành công hay không

• Các hàm thành viên định dạng dữ liệu xuất

– width, setf, precision

– Cách dùng v ới tệp tương tự cách dùng với màn hình (cout)

• Kiểu luồng có thể là kiểu của tham số hình thức

– Nhưng cần được truyền tham chiếu

INT2202 DTH

Trang 46

Tóm t ắt 2

• Tham số kiểu istream (không có chữ "f") chấp nhận đối

số là cin hoặc đối tượng ifstream

• Tham số kiểu ostream (không có chữ "f") chấp nhận đối

số là cout hoặc đối tượng ofstream

• Hàm thành viên eof

– Dùng để kiểm tra xem đã đọc tới vị trí cuối tệp hay chưa

Trang 47

Chu ẩn bị bài tới

• Đọc chương 14 giáo trình (Thừa kế), chương 18 giáo trình (Xử lý ngoại lệ)

Ngày đăng: 13/09/2015, 22:57

TỪ KHÓA LIÊN QUAN

w