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

LẬP TRÌNH ĐỐI TƯỢNG CHƯƠNG 8

42 184 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 42
Dung lượng 85,56 KB

Nội dung

tài liệu hiệu quả nâng cao kỹ năng lập trình

Chương 8 Nhập/Xuất C++ nâng cao • Tạo Bộ thao tác Nhập/Xuất • Nhập/Xuất File • Nhập/Xuất File nhò phân không đònh dạng • Các hàm Nhập/Xuất nhò phân • Truy cập ngẫu nhiên • Kiểm tra trạng thái Nhập/Xuất • Nhập/Xuất theo đơn đặt hàng và các File • Nhập/Xuất theo mảng Chöông 8 Nhaäp / Xuaát C++ naâng cao 228 Chương 8 Nhập / Xuất C++ nâng cao 229 I/ Tạo Bộ thao tác Nhập/Xuất Ngoài bộ chèn và bộ chiết, có thể sửa đổi hệ thống nhập/xuất của C++ bằng cách tạo ra bộ thao tác nhập/xuất tự tạo . Nó có hai lý do : * một bộ thao tác có thể hợp nhất một dãy các thao tác nhập/xuất thành một bộ thao tác tự tạo. * một bộ thao tác nhập/xuất tự tạo cần thiết khi nhập/xuất trên các thiết bò không chuẩn (máy in đặc biệt hay hệ thống nhận dạng quang học) . Có hai loại bộ thao tác, một dùng cho các stream nhập, một dùng cho các stream xuất. Ngoài ra người ta còn phân thành hai nhóm : bộ thao tác có tham số và bộ thao tác không có tham số , chúng khác nhau về cách tạo ra bộ thao tác. Việc tạo ra bộ thao tác có tham số không thuộc phạm vi bài giảng này. • Dạng tổng quát của các bộ thao tác xuất không có tham số : ostream &manip_name(ostream &stream) { // program codes return stream } manip_name tên của bộ thao tác được tạo ra Lưu ý : bộ thao tác trên có đối số là một tham chiếu đến stream mà nó thao tác, khi gọi bộ này, không được kèm theo tên bộ thao tác bất kỳ một đối số nào. • Dạng tổng quát của các bộ thao tác nhập không có tham số : istream &manip_name(istream &stream) { // program codes return stream } Chương 8 Nhập / Xuất C++ nâng cao 230 Một bộ thao tác nhập nhận một tham chiếu đến stream mà nó thao tác. Stream này phải được trả về bởi bộ thao tác. Ví dụ 1.1 Chương trình tạo ra bộ thao tác xuất setup(). Khi được gọi, bộ này sẽ thiết lập độ rộng trường là 10, độ chính xác là 4 và dấu "* " là ký tự lấp đầy. #include <iostream.h> ostream &setup(ostream &stream) { stream. width(10); stream. precision(4); stream. fill('*'); return stream ; } int main() { cout << setup << 123.123456; return 0; } Kết qủa chương trình **123.1234 Ví dụ 1.2 Hai bộ thao tác atn() và note() đơn giản sau đây làm gọn hơn đoạn chương trình in các từ hay đoạn câu hay lặp lại trong chương trình. #include <iostream.h> // Attention: ostream &atn(ostream &stream) { stream << "Attention: "; return stream; } Chương 8 Nhập / Xuất C++ nâng cao 231 // Please note: ostream &note(ostream &stream) { stream << "Please Note: "; return stream; } int main() { cout << atn << "High voltage circuit\n"; cout << note << "Turn off all lights\n"; return 0; } Ví dụ 1.3 Chương trình tạo bộ thao tác nhập getpass() thực hiện báo tiếng chuông và thông báo đề nghò nhập mật khẩu. #include <iostream.h> #include <string.h> // A simple input manipulator istream &getpass(istream &stream) { cout << '\a'; // sound bell cout << "Enter password: "; return stream ; } int main() { char pw[80]; do { cin >> getpass >> pw; Chương 8 Nhập / Xuất C++ nâng cao 232 } while (strcmp(pw, "password")); cout << "Logon complete\n"; return 0; } Bài tập I 1. Hãy tạo một bộ thao tác mới tên là td() dùng để hiện giờ và ngày hiện tại của hệ thống. 2. Hãy tạo một bộ thao tác mới tên làsethex() dùng để thiết lập các trạng thái để in một số thập lục phân, đặt các cờ uppercase và showbase. Ngoài ra, hãy tạo một bộ thao tác xuất tên là reset() để phục hồi lại trạng thái trước khi gọi sethex(). 3. Hãy tạo một bộ thao tác mới tên là skipchar() dùng để đọc và bỏ qua mười ký tự liên tiếp từ một stream nhập. Chương 8 Nhập / Xuất C++ nâng cao 233 II/ Nhập/Xuất File 1/ Khái niệm Để sử dụng nhập/xuất file trong chương trình cần phải nạp file fstream.h . File này đònh nghiã nhiều lớp gồm ifstream , ofstream và fstream . Ba lớp này được suy dẫn từ hai lớp istream và ostream, và ios là lớp cơ sở của chúng. Do đó các lớp ifstream, ofstream và fstream cũng có thể truy xuất đến tất cả các thao tác đã đònh nghóa trong ios . Trong C++, một file được mở bằng cách liên kết nó với một stream . Có ba loại stream : nhập, xuất và nhập/xuất . Trước khi mở file phải tạo ra stream tương ứng. Để tạo một stream nhập , cần khai báo stream đó thuộc lớp ifstream . Để tạo một stream xuất , cần khai báo stream đó thuộc lớp ofstream . Đối với stream thực hiện cả thao tác nhập và xuất , cần khai báo stream đó thuộc lớp fstream . Ví dụ ifstream in ; // input stream ofstream out ; // output stream fstream io ; // input and output stream 2/ Mở file a/ Sau khi tạo ra một stream, có thể mở file gắn với stream đó bằng hàm open() . Hàm này là hàm thành phần của ba stream nói trên, dạng tổng quát : void open (const char *filename , int mode , int access ); filename tên của file cần mở, có thể đi kèm với đường dẫn. mode xác đònh chế độ của file được mở. access xác đònh cách truy cập file @ Các giá trò nguyên của mode , có thể là một hay nhiều giá trò (được kế thừa bởi fstream.h) • Chế độ ios::app làm cho kết xuất được thêm vào cuối của file . Dùng cho các file xuất. Chương 8 Nhập / Xuất C++ nâng cao 234 • Chế độ ios::ate cho phép chuyển đến vò trí cuối file ngay sau khi file được mở. Lưu ý, mặc dù đang ở vò trí cuối file, các thao tác nhập/xuất vẫn có thể xuất hiện ở bất cứ vò trí nào của file. • Chế độ ios::in xác đònh file được mở là file nhập . Chế độ ios::out xác đònh file được mở là file xuất . Tuy nhiên, việc tạo ra một stream bằng các khai báo nó thuộc lớp ifstream ngầm đònh nó là một stream nhập, cũng như khai báo stream thuộc lớp ofstream ngầm đònh nó là một stream xuất. Trong hai trường hợp trên, không cần phải xác đònh các giá trò ios::in và ios::out khi mở file. • Chế độ ios::binary làm cho file được mở ở chế độ nhò phân . Theo mặc đònh, tất cả các file được mở ở chế độ văn bản (text mode). Trong chế độ văn bản, sẽ có một số trường hợp ký tự sẽ bò chuyển đổi. Ví dụ, ký tự tạo dòng mới ( '\n' ) sẽ được chuyển thành chuổi liên tiếp nhau của hai ký tự xuống dòng (carriage return, mã 13), và thêm một dòng (line-feed, mã 10). Khi hoạt động ở chế độ nhò phân, sẽ không có bất kỳ một trường hợp chuyển đổi ký tự nào . Bất kỳ một file nào đều có thể hoạt động ở hai chế độ văn bản hay nhò phân. • Chế độ ios::nocreate làm cho việc gọi hàm open() bò thất bại nếu file được mở là một file mới (chưa có sẵn trên điã). Còn ios::noreplace làm cho việc gọi hàm open() bò thất bại nếu file được mở đã có sẵn trên điã. • Chế độ ios::trunc làm cho khi file có sẵn trùng tên với file được mở sẽ bò xoá sạch nội dung. Có thể sử dụng kết hợp hai hay nhiều chế độ ở trên bằng phép toán OR. @ Các giá trò của đối số access xác đònh cách truy cập file. Giá trò ngầm đònh của đối số này là filebuf::openprot ( filebuf là lớp cha của các lớp stream). Trong môi trường UNIX nó có giá trò 0x644 đối với các file thông thường. Trong môi trường DOS/WINDOWS giá trò của đối số access qui đònh mã thuộc tính của file, bao gồm : Chương 8 Nhập / Xuất C++ nâng cao 235 Thuộc tính Ý nghiã 0 Archive File bình thường : ghi / đọc (mặc đònh) 1 Read only File chỉ đọc 2 Hidden File ẩn 4 System File hệ thống 8 Save Thuộc tính lưu trữ Có thể sử dụng kết hợp hai hay nhiều thuộc tính ở trên bằng phép toán OR. • Ví dụ đoạn chương trình sau minh hoạ việc mở file bình thường trong DOS/WINDOWS ofstream out ; // khai báo stream xuất out.open ("test.txt", ios::out , 0) ; hoặc out.open ("test.txt") ; // lời gọi ngắn gọn, thông thường. • Để mở file nhập/xuất, cần phải xác đònh cả hai chế độ ios::in và ios::out cho đối số mode, được minh hoạ sau đây. Lưu ý, không có giá trò mặc đònh cho trường hợp này. fstream mystream ; // khai báo stream xuất mystream.open ("test.txt", ios::in | ios::out ) ; Nếu hàm open() không thực thi được, stream được trả về sẽ mang giá trò không. Do đó, cần kiểm tra lại việc mở file có thành công hay không, trước khi truy xuất nó. Ví dụ : if(! mystream) { cout << "Can't open file \n"; // handle error } b/ Dùng hàm tạo để mở file Chương 8 Nhập / Xuất C++ nâng cao 236 Thông thường, không cần dùng hàm open() để mở file, vì các lớp ifstream , ofstream và fstream đã có sẵn các hàm tạo dùng để mở file một cách tự động. Các hàm tạo này có các đối số giống hệt như của hàm open(). Dạng thông thường mở file để nhập : ifstream mystream("test.txt"); Cần kiểm tra lại việc mở file có thành công hay không, trước khi truy xuất nó. 3/ Đóng file Dùng hàm void close() . Hàm này không có đối số và không trả về giá trò nào cả. Ví dụ đóng một file đang gắn với stream mystream, cần gọi : mystream.close() ; • Để kiểm tra tình trạng hết file dùng hàm eof() int eof() ; Hàm trả về giá trò ≠ 0 khi đang ở tình trạng cuối file. giá trò = 0 ngược lại. Ví dụ mystream.eof() ; 4/ Truy xuất nội dung trên file Toán tử xuất << và toán tử nhập >> được sử dụng để truy xuất nội dung trên file, cần phải thay các stream cin và cout bằng stream liên kết với file. Thông tin lưu trên file có cùng đònh dạng như khi nó được trình bày trên màn hình. Do đó, các file tạo ra bằng toán tử xuất << và các file được đọc vào bằng toán tử nhập >> đều là các file văn bản có đònh dạng . Ví dụ 2.1 Tạo một file xuất, ghi lên file, đóng file. Mở file đó như một file nhập, đọc nội dung của file. #include <iostream.h> #include <fstream.h>

Ngày đăng: 27/12/2013, 23:02

TỪ KHÓA LIÊN QUAN

w