Tải bản đầy đủ (.pdf) (29 trang)

Hệ thống nhập xuất C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (57.49 KB, 29 trang )




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

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()
Chương 7
Hệ thống Nhập / Xuất C++




208
{
// show default condition of format flags
showflags();

// showpos, showbase, oct, right are on, others off
long f = 0x04A4;

cout.flags(f); // set flags

showflags();
return 0;
}





Bài tập II

1. Hãy viết chương trình thiết lập trạng thái các cờ đònh dạng, sao cho các giá trò
nguyên dương được in ra có mang dấu +. Hãy in ra cho biết là các cờ đònh dạng đã
được thiết lập.

2. Hãy viết chương trình để thiết lập trạng thái các cờ đònh dạng của stream cout sao
cho các giá trò số kiểu dấu chấm động được trình bày với dấu chấm thập phân. Ngoài
ra, các giá trò số kiểu dấu chấm động được in ra dưới dạng số mũ, với ký tự "E" chỉ
phần mũ được trình bày bằng kiểu chữ in hoa.

3. Hãy viết chương trình thực hiện chức năng lưu lại trạng thái hiện tại của các cờ

đònh dạng, tiếp đến thiết lập hai cờ showbase và hex, 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()

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×