Bài giảng Lập trình hướng đối tượng - 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

 

pdf42 trang | Chuyên mục: C/C++ | Chia sẻ: tuando | Lượt xem: 388 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Chương 8: Nhập/Xuất C++ nâng cao, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 ifstream in("test.txt"); 
 if(!in) { 
 cout << "Cannot open input file.\n"; 
 return 1; } 
 coord o3(0, 0), o4(0, 0); 
 in >> o3 >> o4; // write to objects o3, o4 with the contents : 1 2 
 3 4 
 cout << o3 << o4; // output to monitors : 1 2 
 3 4 
 in.close(); 
 return 0; 
} 
Ví dụ 6.2 Các bộ thao tác nhập/xuất có thể dùng để xuất thông tin ra màn hình 
cũng như ra file. 
#include 
Chương 8 Nhập / Xuất C++ nâng cao 
260 
#include 
#include 
// Attention: 
ostream &atn(ostream &stream) 
{ 
 stream << "Attention: "; 
 return stream; 
} 
// Please note: 
ostream ¬e(ostream &stream) 
{ 
 stream << "Please Note: "; 
 return stream; 
} 
int main() 
{ 
 ofstream out("test.txt"); 
 if(!out) { 
 cout << "Cannot open output file.\n"; 
 return 1; 
 } 
 // write to screen 
 cout << atn << "High voltage circuit\n"; 
 cout << note << "Turn off all lights\n"; 
 // write to file 
 out << atn << "High voltage circuit\n"; 
 out << note << "Turn off all lights\n"; 
 out.close(); 
 return 0; 
} 
Chương 8 Nhập / Xuất C++ nâng cao 
261 
Bài tập VII 
1. Với mỗi chương trình trong chương 8, hãy thực hiện các điều chỉnh các bộ chèn, 
bộ chiết và các bộ thao tác nhập/xuất để chúng có thể làm việc được với các file . 
VIII/ Nhập/Xuất theo mảng 
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. 
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 để 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 
#include 
int main() 
{ 
Chương 8 Nhập / Xuất C++ nâng cao 
263 
 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 
#include 
Chương 8 Nhập / Xuất C++ nâng cao 
264 
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 
#include 
int main() 
{ 
 char buf[] = "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 
265 
 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 
#include 
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; 
} 
Chương 8 Nhập / Xuất C++ nâng cao 
266 
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 
#include 
#include 
Chương 8 Nhập / Xuất C++ nâng cao 
267 
#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; 
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. 

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_8_nhapxuat.pdf
Tài liệu liên quan