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
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:
- bai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_8_nhapxuat.pdf