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 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
Hệ thống Nhập /
Xuấ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 là 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
title='hệ thống sản xuất'>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 ý, 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
Hệ thống Nhập /
Xuấ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
title='hệ thống nhập xuất'>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()
[...]... 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. ..
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,... rồi
xuất ra giá trị 100, cuối
cùng lập lại trạng thái ban đầu của các cờ trạng thái.
III/ Sử dụng các hàm width(), precision() và fill()
Chương 7
Hệ
thống Nhập /
Xuất C++
214
Quá tải toán tử Nhập/
Xuất cho
các lớp tự tạo
là một trong những lý do quyết định sử
dụng mệnh đề Nhập/
Xuất của
C++ thay cho việc sử dụng các hàm Nhập/
Xuất theo
kiểu C.
•
Theo C++,
thao tác xuất
...
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. ..
3/ Các hàm liên quan đến cờ định dạng
Chương 7
Hệ
thống Nhập/
Xuất C++
•
title='cơ sở sản xuất'>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
Hệ
thống Nhập /
Xuất C++
209
Các hàm này thiết lập các tham số định dạng gồm : độ rộng của... tác Nhập/
Xuất (I/O Manipulator)
Bộ thao tác Nhập/ Xuất
là các hàm đặc biệt sử dụng trong các mệnh đề Nhập/ Xuất.
Cần phải nạp file tiêu đề
iomanip.h
vào chương trình. Các bộ thao tác Nhập/
Xuất
chuẩn được trình bày trong bảng sau :
Bộ thao tác Mục đích Nhập/
Xuất
dec Định dạng dữ liệu kiểu số ở dạng thập phân
Xuất
endl
Xuất một ký tự xuống dòng và
đẩy stream ra thiết bị vật lý
Xuất
ends Xuất. .. 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
return 0;
}
Kết quả của chương trình
hello
%%%%%%%hello
hello%%%%
123.234567%%
123.234%%%
Ví dụ 3.2
Các hàm định dạng Nhập/
Xuất của
C++
// Create a table of square roots and squares.
#include <iostream.h>... trong f Nhập/
Xuất
setprecision(int p) Đặt độ chính xác là p
Xuất
setw(int w) Đặt độ rộng của trường là w
Xuất
ws Bỏ qua các ký tự cách (khoảng cách, tab, xuống
dòng)
Nhập
Các bộ thao tác có thể
xuất hiện trong các mệnh đề Nhập/ Xuất. Ví dụ
cout <<
oct
<< 100 <<
hex
<< 100;
Chương 7
Hệ
thống Nhập /
Xuất C++
216
if(f & ios::unitbuf) cout <<... 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...
int onhand; // number on hand
double cost; // cost of item
public:
inventory(char *i, int o, double c)
{
Chương 7
Hệ
thống Nhập /
Xuất C++
208
Chương 7
Hệ
thống Nhập /
Xuất C++
211
1. Hãy viết chương trình thiết in ra logarit cơ số tự nhiên và logarit cơ số thập phân
của các con số từ 2 đến .
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. 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