Nhập xuất C++ nâng cao

42 1.1K 1
Nhập xuất C++ nâng cao

Đ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

Bài giảng lập trình hướng đối tượng - Thầy Cường Học viện bưu chính viễn thông TP HCM

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 Nhập / Xuất C++ nâ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> [...]... "Hello 100 123.125 a"; istrstream istr (buf); char c; while(! istr.eof() ) { istr.get(c) ; Chương 8 Nhập / Xuất C++ nâng cao 254 Hệ thống nhập/ xuất C++ lưu lại thông tin trạng thái kết qủa của mỗi tác vụ nhập/ xuất. Trạng thái hiện hành của hệ thống nhập/ xuất được mã hoá thành một số nguyên. Tên cờ Ý nghiã goodbit là 0 nếu không gặp lỗi là 1 nếu gặp lỗi eofbit... Trần Nguyên Hãn 04.6781234 3. Viết chương trình đếm số lượng từ có trong một text file bất kỳ. III/ Nhập/ Xuất File nhị phân không định dạng Việc nhập/ xuất file nhị phân không định dạng linh động hơn nhập/ xuất text file. Chương 8 Nhập / Xuất C++ nâng cao 231 // Please note: ostream &note(ostream &stream) { stream << "Please Note: ";... quả chương trình Thông báo lỗi "I/O Error terminating" sẽ xuất hiện khi có lỗi nhập/ xuất trong lúc xuất nội dung của file có tên <filename> . Bài tập VI 1. Hãy thêm phần kiểm tra và báo lỗi nhập/ xuất vào các chương trình trong các bài tập phần V, chương 8. Chương 8 Nhập / Xuất C++ nâng cao 256 ///////////////////////////////////////////////////////////////... return 1; } Chương 8 Nhập / Xuất C++ nâng cao 268 return stream; } // define the functions here // void store(fstream &stream) { } // void retrieve(fstream &stream) { } 6. Hãy viết chương trình tạo ra lớp stack chứa các ký tự và lưu stack này vào một file. Xuất nội dung file này ra màn hình. Chương 8 Nhập / Xuất C++ nâng cao 260 #include... skip spaces 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... >> ob.cost; Chương 8 Nhập / Xuất C++ nâng cao 251 Hàm seekp() dời con trỏ put của file tương ứng đi một đoạn bằng offset byte tính từ vị trí được xác định bởi origin. • Hệ thống nhập/ xuất của C++ sử dụng hai con trỏ để quản lý một file. Thứ nhất là con trỏ get để trỏ đến vị trí sẽ được đưa vào nếu file được thực hiện một tác vụ nhập nữa. Thứ hai là con trỏ put ... bởi buf . Kích thước của mảng xác định bởi size . Đối với các thao tác nhập/ xuất, chế độ mode phải là ios::in | ios::out . • Ghi nhớ , tất cả các hàm nhập/ xuất trong hai chương 7 và 8 vẫn áp dụng cho nhập/ xuất theo mảng, kể cả các hàm nhập/ xuất nhị phân và ngẫu nhiên . Ví dụ 8 .1 chương trình sẽ mở một mảng xuất và ghi lên mảng // A short example using array-based output. #include... đều bị xoá về trị 0. Ngược lại, có thể đặt giá trị flags để lập cờ theo ý riêng. Chương 8 Nhập / Xuất C++ nâng cao 262 Khi một mảng được mở để cho kết xuất , các ký tự sẽ được đưa vào mảng cho đến khi mảng bị đầy, mảng không được phép bị tràn. Mọi cách để ghi lên mảng đầy sẽ gây lỗi nhập/ xuất. • Hàm pcount() trả về số lượng ký tự đã được ghi vào trong mảng, kể cả ký tự NULL để... string cout << "String: " << str; } else in.get(); // ignore 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 "*... 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 240 while(!fin.eof()) { fin >> ch ; if(ch == ' . 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ò. 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 Nhập / Xuất C++ nâng cao

Ngày đăng: 21/08/2012, 15:34

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan