Hướng đối tượng - Các dòng nhập xuất
Trang 1I Sử dụng dòng chuẩn cho việc nhập xuất
Các lớp của thư viện
iostream.h quan niệm dữ liệu đi từ chương trình (các biến) đến một thiết bị (ví dụ: màn hình, file)
hoặc ngược lại như một dòng (stream) Khái niệm này cho phép đóng gói (encapsulation) các tác
vụ liên quan đến nhập xuất thông tin.
Trang 2Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
I Sử dụng dòng chuẩn cho việc nhập xuất
đến ghi đĩa tốn rất nhiều thời gian vì vậy các tác vụ này
thường phải cần đến
bộ nhớ đệm (buffer)
dữ liệu trước khi ghi trực tiếp lên đĩa.
Trang 3I Sử dụng dòng chuẩn cho việc nhập xuất
Các lớp:
iostream
streambuf ios
fstream
Lớp cơ sở cho các lớp dòng nhập xuất, lớp này có một biến thành phần thuộc lớp streambuf
Quản lí buffer: fill, empty, flush
và các thao tác khác về buffer.
Chuyên trách các tác vụ liên quan đến dòng xuất
Cung cấp các phương thức nhập/ xuất màn hình
Cung cấp các phương thức nhập/xuất file.
Trang 4Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
Các đối tượng nhập xuất chuẩn.
khởi đầu thì bốn đối tượng sau được khởi tạo:
cin (đọc "see-in") quản các dòng nhập từ thiết bị nhập chuẩn (bàn phím)
cout (đọc "see-out") quản các dòng xuất ra thiết bị xuất chuẩn (màn hình)
cerr (đọc "see-err") quản việc xuất ra thiết bị lỗi chuẩn (màn hình) đối với kết xuất không sử dụng buffer Mọi thứ gởi đến cerr đều được ghi lên thiết bị lỗi ngay tức khắc (không cần chờ lệnh Fill hoặc Flush buffer)
clog (đọc "see-log") quản các dòng thông báo cần được buffer ra thiết bị lỗi chuẩn Thông thường việc này được định hướng lại (redirected) ra file log
Trang 5II Nhập xuất với dữ liệu chuẩn.
cout : Để kết xuất trên dòng chuẩn ta dùng toán tử chuyển trái cấp bit <<
Cú pháp: cout << variable;
cin: Để nhập trên dòng chuẩn ta dùng toán
tử chuyển phải cấp bit >>
Cú pháp: cin >> variable;
ĐỂ ĐỊNH DẠNG KẾT XUẤT CẦN DÙNG CẦN DÙNG CÁC HÀM ĐIỀU TÁC
(MANIPULATE FUNCTION) THUỘC <iomanip.h> XIN XEM THÊM CÁC TÀI LIỆU VỀ IOMANIP
Trang 6Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
Các vấn đề với chuỗi trên dòng nhập xuất.
tự (char*) :
char HoTen[50] ; cout << “Xin nhap ho ten: ";
cin >> HoTen;
Giả sử nhập LeHung thì biến HoTen sẽ được “đổ đầy vào” các kí tự L, e, H, u, n, g,
\0 Cuối cùng là kí tự null.
Trang 7Các vấn đề với chuỗi trên dòng nhập xuất.
toán tử tách (separator), vì vậy nó sẽ đặt ngay kí
tự null vào buffer ngay khi gặp kí tự này (việc
cout << “Ho ten la: " << HoTen << endl;
cout << “Xin nhap day du ho ten: ";
cin >> HoTen;
cout << “Ho va ten day du la: " << HoTen << endl;
return 0; }
Trang 8Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
#include <iostream.h>
int main()
{int myInt; long myLong; double myDouble; float
myFloat; unsigned int myUnsigned; char
myWord[50];
cout << "int: "; cin >> myInt;
cout << "Long: "; cin >> myLong;
cout << "Double: "; cin >> myDouble;
cout << "Float: "; cin >> myFloat;
cout << "Word: "; cin >> myWord;
cout << "Unsigned: "; cin >> myUnsigned;
cout << "\n\nInt:\t" << myInt << endl;
cout << "Long:\t" << myLong << endl;
cout << "Double:\t" << myDouble << endl;
cout << "Float:\t" << myFloat << endl;
cout << "Word: \t" << myWord << endl;
cout << "Unsigned:\t" << myUnsigned << endl;
cout << "\n\nInt, Long, Double, Float, Word,
Unsigned: \n";
cin >> myInt >> myLong >> myDouble;
cin >> myFloat >> myWord >> myUnsigned;
cout << "\n\nInt:\t" << myInt << endl;
cout << "Long:\t" << myLong << endl;
cout << "Double:\t" << myDouble << endl;
cout << "Float:\t" << myFloat << endl;
cout << "Word: \t" << myWord << endl; 42:
cout << "Unsigned:\t" << myUnsigned << endl;
return 0; }
Một trường hợp chạy chương trình
int: 2 Long: 30303 Double: 393939397834 Float: 3.33
Word: Hello Unsigned: 85
Long: 30303 Double: 3.93939e+11 Float: 3.33
Word: bye Unsigned: 65534
Nếu không xem khoảng trắng này
là kết thúc dòng myWord thì sẽ gặp nhầm lẫn
Trang 9Sử dụng cin với mãng kí tự (chuỗi).
Using get() with a character array
cout << "stringOne: " << stringOne << endl;
cout << "Enter string two: ";
Trang 10Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
Trang 11void open (const char * filename, openmode mode );
void close ();
Trong đó mode là một trong các cờ sau:
Có thể dùng phối hợp các mode bằng cách dùng toán tử bit OR “ | ”, ví dụ:
ofstream file;
file.open("example.bin", ios::out | ios::app | ios::binary);
Trang 12Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
{ examplefile << "This is a line.\n";
examplefile << "This is anotherline.\n";
ifstream examplefile ("example.txt");
if (! examplefile.is_open()) { cout << "Error opening file";
exit (1); } while (! examplefile.eof() ) { examplefile.getline (buffer,100);
cout << buffer << endl; } return 0; }
Trang 13Có thể dùng một số hàm sau để xác định trạng thái của dòng
nhập xuất file Tất cả các hàm dưới đây đều trả về giá trị bool:
bad() : Trả về true nếu có lỗi trong tác vụ đọc/ghi Ví dụ như các lỗi về thiết bị.
fail() : Trả về true nếu có lỗi về dạng thức dữ liệu trong tác vụ
đọc/ ghi
eof() : Trả về true nếu file đang mở đã đến cuối file
good() : Trả về false trong trường hợp các hàm kể trên trả về
true.
Để reset các cờ trạng thái dùng hàm clear() , không cần tham
số nào chuyển giao cho hàm
Trang 14Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
Con trỏ dòng nhập xuất file
con trỏ dòng get và put
Mọi đối tượng dòng nhập xuất đều có ít nhất một con trỏ dòng:
ifstream , giống như istream , có con trỏ get để trỏ đến phần tử sẽ đọc kế tiếp
ofstream , giống như ostream , có con trỏ put để trỏ đến vị trí phần tử sẽ được ghi .
fstream , giống như iostream , được thừa kế cả hai: get và put
Các con trỏ dòng này trỏ đến vị trí trong các tác vụ nhập/xuất của các hàm sau đây:
tellg() và tellp()
Đó là một kiểu số nguyên biểu diễn vị trí hiện tại của con trỏ dòng get (trường hợp tellg) hoặc con trỏ
nguyên mẫu khác nhau:
Trang 15 // obtaining file size
Trang 16Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
Binary files
được thiết kế riêng để thực hiện tác vụ nhập
Trong đó buffer là bộ đệm đọc/ghi Kích thước (size)
là số nguyên biểu diễn số kí tự đọc (ghi) từ (resp vào) buffer.
Trang 17 // reading binary file
#include <iostream.h>
#include <fstream.h>
const char * filename = "example.txt";
int main ()
{ char * buffer; long size;
ifstream file (filename, ios::in|ios::binary|ios::ate);
size = file.tellg();
file.seekg (0, ios::beg);
buffer = new char [size];
file.read (buffer, size);
file.close();
cout << "the complete file is in a buffer";
delete[] buffer;
return 0; }
Trang 18Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
I Sử dụng dòng chuẩn cho việc nhập xuất
Các toán tử “<“ và “>” cho phép định
hướng lại dòng nhập xuất đến một thiết bị khác thiết bị chuẩn
Trang 19III Sử dụng dòng nhập xuất chuẩn với các lớp
mới.
Trang 20Sinh viên cần nghiên cứu thêm, đầy đủ trong: Teach Yourself C++ in 21 days (Day 16)
IV Lọc dữ liệu trích từ dòng.
Trang 21VI Dòng nhập xuất định dạng trong bộ nhớ.