0

Nhập/Xuất theo mảng

Một phần của tài liệu NHẬP XUẤT C++ NÂNG CAO (Trang 35-35 )

Ngoài nhập/xuất thiết bị chuẩn (I/O console) và nhập/xuất file, C++ còn hổ trợ một

bộ đầy đủ các hàm dùng dãy ký tự như một thiết bị nhập hoặc thiết bị xuất.

Nhập/xuất theo mảng của C++ mềm dẻo và hữu hiệu hơn C (các hàm sscanf() và sprintf()) vì nó cho phép sử dụng các kiểu do người dùng định nghĩa.

Trong một số tài liệu khác về C++, nhập/xuất theo mảng còn được gọi là nhập/xuất

trên RAM.

Phần này chỉ khảo sát những đặc trưng quan trọng nhất của nhập/xuất theo mảng.

• Nhập/xuất theo mảng vẫn hoạt động thông qua các stream. Cần nạp file

strstream.h vào chương trình, nó định nghĩa 3 lớp istrstream, ostrstream và strstream. Chúng tạo ra stream nhập, stream xuất và stream nhập/xuất theo mảng.

Các lớp trên đều có chung một lớp cơ sở là ios, nên tất cả các hàm và bộ thao tác của istream, ostream và iostream đều có mặt trong istrstream, ostrstream và strstream.

Một số hàm bổ sung sau đây sẽ liên kết stream với một vùng trong bộ nhớ thông qua

buf.

Dạng tổng quát của hàm tạo của ostrstream, để sử dụng một mảng xuất

ostrstream ostr(char *buf, int size, int mode = ios::out) ;

với ostr là stream tương ứng với mảng buf. Kích thước của mảng xác định bởi size.

Chế độ mode được mặc định là xuất, nhưng có thể thay đổi bất kỳ mode xuất nào của ios.

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 để kết thúc.

int pcount() ;

Khi gọi, cần gắn tên hàm này với một stream cụ thể.

Dạng tổng quát của hàm tạo của istrstream, dùng để mở một mảng nhập

istrstream istr(const char *buf) ;

với istr là stream nhập, buf là một con trỏ đến mảng được dùng làm mảng nhập.

Khi đọc một mảng, hàm eof() sẽ trả về trị true khi gặp hết mảng.

Để tạo ra một mảng nhập/xuất, dùng hàm tạo của strstream có dạng

strstream iostr(char *buf, int size, int mode = ios::out) ;

với iostr là stream nhập/xuất và nó sử dụng một mảng được trỏ 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 <iostream.h> #include <strstream.h> int main()

char buf[255]; // output buffer

ostrstream ostr(buf, sizeof(buf)); // open output array // output to monitor

ostr << "Array-based I/O uses streams just like "; ostr << "'normal' I/O\n" << 100;

ostr << ' ' << 123.23 << '\n';

// you can use manipulators, too

ostr << hex << 100 << ' ';

// or format flags

ostr.setf(ios::scientific);

ostr << dec << 123.23;

ostr << endl << ends; // ensure that buffer is null-terminated // show resultant string

cout << buf;

return 0; }

Kết quả chương trình

Array-based I/O uses streams just like 'normal' I/O 100 123.23

64 01.2323e+02

@ Có thể thấy các hàm nhập/xuất quá tải, các bộ thao tác nhập/xuất, các hàm thành phần và các cờ định dạng đều có thể dùng được trong nhập/xuất theo mảng.

Chương trình đã xoá mảng bằng bộ thao tác ends. Ví dụ 8.2 chương trình minh hoạ nhập theo mảng

// An example using array-based input. #include <iostream.h>

int main() {

char buf[] = "Hello 100 123.125 a";

istrstream istr(buf); // open input array int i;

char str[80]; float f; char c;

istr >> str >> i >> f >> c; // from keyboard cout << str << ' ' << i << ' ' << f;

cout << ' ' << c << '\n'; return 0;

}

• Khi một mảng nhập được liên kết với một stream, nó rất giống như một file.

Ví dụ 8.3 chương trình sử dụng nhập/xuất nhị phân và hàm eof() để đọc nội dung của mảng buf

// Demonstrate get() and eof() with array-based I/O. #include <iostream.h>

#include <strstream.h> int main()

{

char buf[] = "Hello 100 123.125 a";

istrstream istr(buf);

char c;

while(!istr.eof()) { istr.get(c);

if(!istr.eof()) cout << c; }

return 0; }

Ví dụ 8.4 chương trình minh hoạ mảng nhập/xuất

// Demonstrate an input/output array. #include <iostream.h>

#include <strstream.h> int main()

{

char iobuf[255];

strstream iostr(iobuf, sizeof(iobuf), ios::in | ios::out);

// output to iobuf[]

iostr << "This is a test\n";

iostr << 100 << hex << ' ' << 100 << ends;

char str[80]; int i;

// read again from iobuf[]

iostr.getline(str, 79); // read string up to \n

iostr >> dec >> i; // read 100 cout << str << ' ' << i << ' ';

// read continue from iobuf[]

iostr >> hex >> i;

cout << hex << i; return 0;

Bài tập VIII

1. Hãy hiệu chỉnh lại chương trình trong ví dụ 8.1 chương 8, sao cho nó in ra số lượng ký tự được ghi vào buf trước khi chương trình kết thúc.

2. Viết chương trình cho một ứng dụng nhập/xuất theo mảng để sao chép nội dung một mảng này sang một mảng khác.

3. Viết chương trình cho một ứng dụng nhập/xuất theo mảng để chuyển một chuỗi ký tự thành một gía trị số kiểu dấu chấm động tương ứng với gía trị mà chuỗi đó biểu diễn .

Bài tập chương 8

1. Viết chương trình tạo ra một bộ thao tác xuất ra ba ký tự tab và đặt độ rộng của trường là 20.

2. Viết chương trình tạo ra một bộ thao tác findalpha nhập và hủy bỏ các ký tự không phải là chữ cái. Khi bắt gặp ký tự chữ cái đầu tiên, bộ thao tác này đưa trả ký tự vừa nhập trở lại stream và kết thúc.

3. Viết chương trình sao chép một text file. Trong quá trình xử lý, hãy chuyển kiểu chữ của tất cả ký tự sao cho chữ in hoa biến thành chữ thường và ngược lại.

4. Viết chương trình đọc vào một text file và in ra số lượng chữ cái xuất hiện trong file.

5. Chương trình sau đây có hiệu chỉnh lại của lớp inventory trong chương 7. Hãy viết các hàm store() và retrieve(). Hãy tạo ra một file tồn kho chứa vài mẫu tin. Sau đó bằng nhập/xuất ngẫu nhiên, hãy cho phép ngươì dùng nhập vào số thứ tự của mẫu tin cần xem , và trình bày nội dung của mẫu tin đó.

#include <iostream.h> #include <fstream.h> #include <string.h>

#define SIZE 40 class inventory {

char item[SIZE]; // name of item int onhand; // number on hand double cost; // cost of item public:

inventory(char *i, int o, double c) {

strcpy(item, i); onhand = o; cost = c; }

void store(fstream &stream); void retrieve(fstream &stream);

friend ostream &operator<<(ostream &stream, inventory ob); friend istream &operator>>(istream &stream, inventory &ob); };

ostream &operator<<(ostream &stream, inventory ob) {

stream << ob.item << ": " << ob.onhand; stream << " on hand at $" << ob.cost << '\n'; return stream;

}

istream &operator>>(istream &stream, inventory &ob) {

cout << "Enter item name: "; stream >> ob.item;

cout << "Enter number on hand: "; stream >> ob.onhand;

cout << "Enter cost: "; stream >> ob.cost;

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.

Một phần của tài liệu NHẬP XUẤT C++ NÂNG CAO (Trang 35 -35 )