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

29 266 0
LẬP TRÌNH ĐỐI TƯỢNG CHƯƠNG 7

Đ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

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

Chương 7 Hệ thống Nhập/Xuất C++ • Cơ sở Nhập/Xuất C++ • Nhập/Xuất có đònh dạng • Sử dụng width(), precision() và fill() • Sử dụng bộ thao tác Nhập/Xuất • Tạo bộ chèn • Tạo bộ chiết Chöông 7 Heä thoáng Nhaäp / Xuaát C++ 208 Chương 7 Hệ thống Nhập / Xuất C++ 209 I/ Cơ sở Nhập/Xuất C++ Hệ thống Nhập/Xuất của C++ cũng điều khiển các stream . • Stream la ø một thiết bò logic có chức năng tạo ra hoặc sử dụng thông tin. Nhờ hệ thống Nhập/Xuất của C++, mỗi stream được liên kết với thiết bò vật lý . Cho dù có nhiều loại thiết bò vật lý khác nhau, nhưng các stream đều được xử lý như nhau . Chính vì vậy mà hệ thống Nhập/Xuất có thể vận hành trên bất kỳ loại thiết bò nào. Khi một chương trình C++ được thực thi sẽ có bốn stream được mở một cách tự động. Stream Ý nghiã Thiết bò mặc đònh cin thiết bò nhập chuẩn Bàn phím cout thiết bò xuất chuẩn Màn hình cerr thiết bò báo lỗi chuẩn Màn hình clog Phiên bản của cerr Màn hình Có thể đònh lại cho các stream để liên kết gắn với các thiết bò xuất nhập khác. • Trong chương I, C++ cung cấp các hổ trợ cho hệ thống Nhập/Xuất trong file iostream.h Nội dung của file này là các phân cấp lớp hổ trợ các thao tác Nhập/Xuất. C++ có hai phân cấp lớp Nhập/Xuất, chúng có liên hệ với nhau nhưng chúng không giống nhau. Phân cấp lớp Nhập/Xuất thứ nhất được suy dẫn từ lớp Nhập/Xuất mức thấp tên là streambuf . Lớp này cung cấp các thao tác cơ bản của Nhập/Xuất cấp thấp, cũng như các hổ trợ cơ bản cho toàn bộ hệ thống Nhập/Xuất của C++ . Lập trình viên trình độ cao nên sử dụng trực tiếp lớp streambuf này. Phân cấp lớp Nhập/Xuất thứ hai có tên ios , là lớp Nhập/Xuất cấp cao. Nó cung cấp các thao tác về đònh dạng, kiểm lỗi, chứa nhiều hàm và biến dùng để điều khiển và kiểm soát các thao tác cơ bản của các stream Nhập/Xuất. Lớp ios là lớp cơ sở để suy dẫn ra các lớp istream , ostream và iostream.h . Ba lớp dẫn xuất này được sử dụng để tạo ra các stream Nhập, Xuất và Nhập/Xuất. Chương 7 Hệ thống Nhập / Xuất C++ 210 II/ Nhập/Xuất có đònh dạng 1/ Mỗi stream của C++ được đi kèm với các cờ đònh dạng (format flags). Các cờ đònh dạng này xác đònh cách thức thể hiện của dữ liệu, các cờ được mã hoá dưới dạng số nguyên kiểu long int. Các cờ đònh dạng được đặt tên và giá trò trong lớp ios qua bảng liệt kê như sau : // ios format flags enum{ skipws = 0x0001; left = 0x0002; right = 0x0004; internal = 0x0008; dec = 0x0010; oct = 0x0020; hex = 0x0040; showbase = 0x0080; showpoint = 0x0100; uppercase = 0x0200; showpos = 0x0400; scientific = 0x0800; fixed = 0x1000; unitbuf = 0x2000; stdio = 0x4000; }; Khi một cờ đònh dạng nào đó được thiết lập thì đặc tính của cờ đó trở nên có hiệu lực. Nếu cờ đònh dạng bò xoá, hệ thống sẽ dùng giá trò mặc đònh cho đặc tính của cờ đó. 2/ Mô tả các cờ đònh dạng • Khi cờ skipws được thiết lập, các ký tự cách (gồm các ký tự khoảng cách, tab và xuống dòng) được bỏ đi khi đọc một stream. Nếu cờ này bò xoá, các ký tự cách sẽ không bò bỏ đi. Thường áp dụng cho một số kiểu file trên diã. Chương 7 Hệ thống Nhập / Xuất C++ 211 • Khi cờ left được thiết lập, kết xuất sẽ được canh biên trái. • Khi cờ right được thiết lập, kết xuất sẽ được canh biên phải. • Khi cờ internal được thiết lập, dấu của trò số được canh biên trái trong khi con số được canh biên trái. Nếu cả ba cờ đều bò xoá, theo mặc đònh, kết xuất sẽ được canh biên phải. • Theo mặc đònh, giá trò nguyên được trình bày dưới dạng số thập phân. Tuy nhiên. có thể thay đổi cơ số của kết xuất. Thiết lập cờ oct sẽ làm cho kết xuất được trình bày dưới dạng số hệ bát phân. Thiết lập cờ hex kết xuất là số hệ thập lục. Để trả lại kiểu số thập phân, cần thiết lập cờ dec . • Khi đặt cờ showbase , cơ số của giá trò số được trình bày. • Khi đặt cờ showpoint cho phép in dấu chấm thập phân và các số không đi sau kèm theo các giá trò kiểu dấu chấm động. • Theo mặc đònh, khi một con số kiểu số mũ được in ra, chữ "e" được trình bày ở kiểu chữ thường. Tương tự, khi in một giá trò số ở hệ thập lục, ký tự " dùng chỉ hệ thập lục được trình bày ở kiểu chữ thường. Khi cờ upcase được thiết lập, các ký tự nói trên sẽ được trình bày bằng kiểu chữ in hoa. • Khi đặt cờ showpos làm cho xuất hiện dấu cộng phiá trước các giá trò số dương. • Khi đặt cờ scientific làm các giá trò số kiểu dấu chấm động được trình bày dươí dạng mũ. Nhưng khi đặt cờ fixed , các giá trò số kiểu dấu chấm động được trình bày dươí dạng thường có 6 số lẽ. • Khi đặt cờ unitbuf , hệ thống Nhập/Xuất của C++ đẩy stream xuất ra hết sau mỗi thao tác xuất. • Khi đặt cờ stdio , thiết bò xuất chuẩn stdout và thiết bò nhập chuẩn stdin sẽ được đẩy ra sau mỗi thao tác xuất. Tuy nhiên cờ này không được đònh nghiã trong chuẩn trù đònh ANSI C++, và có thể không áp dụng trong một số trình biên dòch. 3/ Các hàm liên quan đến cờ đònh dạng Chương 7 Hệ thống Nhập / Xuất C++ 212 • Hàm setf() dùng thiết lập cờ đònh dạng. Hàm này thuộc lớp ios . Dạng tổng quát : long setf (long flags ) ; Hàm trả về giá trò được thiết lập trước đó của cờ và thiết lập các cờ có tên trong hàm. Ví dụ thiết lập cờ showpos : stream .setf(ios::showpos) ; stream là tên stream cần để thiết lập cờ showpos Lưu y ù, trong C++, không thể đặt cờ đònh dạng ở phạm vi toàn cục chung cho tất cả các stream, mỗi stream sẽ mang một thông tin trạng thái các đònh dạng riêng của nó và chúng độc lập với nhau. Có thể gọi hàm setf() để lập nhiều cờ cùng lúc, bằng cách dùng toán tử OR. Ví dụ cout .setf(ios::showbase | ios::hex) ; • Hàm xoá cờ unsetf() , dùng để xoá một hay nhiều cờ đònh dạng. Dạng tổng quát : long unsetf (long flags ) ; Hàm trả về giá trò trước đó của cờ. • Hàm flags() cho biết trạng thái của cờ đònh dạng. Hàm này thuộc lớp ios . Dạng thường gọi : long flags () ; Dạng có kèm đối số long flags (long f ) ; cho phép thiết lập tất cả các cờ đònh dạng của stream dựa theo giá trò của đối số khi gọi hàm. Từng bit của giá trò f sẽ được gán cho biến lưu trò cờ đònh dạng, và sẽ xoá tình trạng cờ đònh dạng trước đó. Hàm sẽ trả về giá trò tình trạng các cờ đònh dạng trước đó. Ví dụ 2.1 Minh hoạ hàm setf() #include <iostream.h> Chương 7 Hệ thống Nhập / Xuất C++ 213 int main() { // display using default settings cout << 123.23 << " hello " << 100 << '\n'; cout << 10 << ' ' << -10 << '\n'; cout << 100.0 << "\n\n"; // now, change formats cout. unsetf (ios::dec); // not required by all compilers cout. setf (ios::hex | ios::scientific); cout << 123.23 << " hello " << 100 << '\n'; cout. setf (ios::showpos); cout << 10 << ' ' << -10 << '\n'; cout. setf (ios::showpoint | ios::fixed); cout << 100.0; return 0; } Kết quả của chương trình 123.23 hello 100 10 -10 100 1.232300e+02 hello 64 a fffffff6 +100.000000 Ví dụ 2.2 Minh hoạ hàm unsetf() #include <iostream.h> int main() { Chương 7 Hệ thống Nhập / Xuất C++ 214 cout.unsetf(ios::dec); cout.setf(ios::uppercase | ios::showbase | ios::hex); cout << 88 << '\n'; cout.unsetf(ios::uppercase); cout << 88 << '\n'; return 0; } Ví dụ 2.3 Minh hoạ hàm flags() #include <iostream.h> void showflags(); int main() { // show default condition of format flags showflags(); cout.setf(ios::oct | ios::showbase | ios::fixed); showflags(); return 0; } // This function displays the status of the format flags. void showflags() { long f ; f = cout.flags(); // get flag settings Kết quả của chương trình 0X58 0x58 Chöông 7 Heä thoáng Nhaäp / Xuaát C++ 215 if(f & ios::skipws) cout << "skipws on\n"; else cout << "skipws off\n"; if(f & ios::left) cout << "left on\n"; else cout << "left off\n"; if(f & ios::right) cout << "right on\n"; else cout << "right off\n"; if(f & ios::internal) cout << "internal on\n"; else cout << "internal off\n"; if(f & ios::dec) cout << "dec on\n"; else cout << "dec off\n"; if(f & ios::oct) cout << "oct on\n"; else cout << "oct off\n"; if(f & ios::hex) cout << "hex on\n"; else cout << "hex off\n"; if(f & ios::showbase) cout << "showbase on\n"; else cout << "showbase off\n"; if(f & ios::showpoint) cout << "showpiont on\n"; else cout << "showpoint off\n"; if(f & ios::showpos) cout << "showpos on\n"; else cout << "showpos off\n"; if(f & ios::uppercase) cout << "uppercase on\n"; else cout << "uppercase off\n"; if(f & ios::scientific) cout << "scientific on\n"; else cout << "scientific off\n"; if(f & ios::fixed) cout << "fixed on\n"; else cout << "fixed off\n"; Chương 7 Hệ thống Nhập / Xuất C++ 216 if(f & ios::unitbuf) cout << "unitbuf on\n"; else cout << "unitbuf off\n"; if(f & ios::stdio) cout << "stdio on\n"; else cout << "stdio off\n"; cout << "\n"; } Kết quả của chương trình skipws is on left is off right is off internal is off dec is off oct is off hex is off showbase is off showpoint is off uppercase is off showpos is off scientific is off fixed is off unitbuf is off stdio is off skipws is on left is off right is off internal is off dec is off oct is on hex is off showbase is on showpoint is off uppercase is off showpos is off scientific is off fixed is on unitbuf is off stdio is off Ví dụ 2.4 Minh hoạ hàm flags(), sử dụng mặt nạ cờ (flag mask) dùng để thiết lập các cờ showpos, showbase, oct và right. Bốn cờ này mang giá trò tương ứng là 0x0400, 0x0080, 0x0020, 0x0004. Cộng bốn giá trò này ta có giá trò 0x04A4 . #include <iostream.h> void showflags() ; int main()

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

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan