Xuấtramáyin Trong số 4 dòngtin chuẩn không dòng nào gắn với máy in. Như vậy không thể dùng cácdòng này để xuất dữ liệu ramáy in. Để xuất dữ liệu ramáyin (cũng như nhập, xuất trên tệp) cần tạo racácdòngtin mới và cho nó gắn với thiết bị cụ thể. C++ cung cấp 3 lớp stream để làm điều này, đó là các lớp: ifstream dùng để tạo dòng nhập ofstream dùng để tạo dòngxuất fstream dùng để tạo dòng nhập, dòngxuất hoặc dòng nhập-xuất Mỗi lớp có 4 hàm tạo dùng để khai báo cácdòngtin (đối tượng dòng tin). Trong mục sau sẽ nói thêm về các hàm tạo này. Để tạo một dòngxuất và gắn nó với máyin ta có thể dùng một trong các hàm tạo sau: ofstream Tên_dòng_tin(int fd) ; ofstream Tên_dòng_tin(int fd, char *buf, int n) ; Trong đó: + Tên_dòng_tin là tên biến đối tượng kiểu ofstream hay gọi là tên dòngxuất do chúng ta tự đặt. + fd (file descriptor) là chỉ số tập tin. Chỉ số tậptin định sẵn đối với stdprn (máy in chuẩn) là 4. + Các tham số buf và n xác định một vùng nhớ n byte do buf trỏ tới. Vùng nhớ sẽ được dùng làm bộ đệm cho dòng xuất. Ví dụ 1 câu lệnh: ofstream prn(4) ; sẽ tạo dòngtinxuất prn và gắn nó với máyin chuẩn. Dòng prn sẽ có bộ đệm mặc định. Dữ liệu trước hết chuyển vào bộ đệm, khi đầy bộ đệm thì dữ liệu sẽ được đẩy từ bộ đệm radòng prn. Để chủ động yêu cầu đẩy dữ liệu từ bộ đệm radòng prn có thể sử dụng phương thức flush hoặc bộ phận định dạng flush. Cách viết như sau: prn.flush(); // Phương thức prn << flush ; // Bộ phận định dạng Các câu lệnh sau sẽ xuất dữ liệu ra prn (máy in) và ý nghĩa của chúng như sau: prn << “\nTong = “ << (4+9) ; // Đưa một dòng vào bộ đệm prn << “\nTich =“ << (4*9); // Đưa tiếp dòng thứ 2 vào bộ đệm prn.flush(); // Đẩy dữ liệu từ bộ đệm ramáyin (in 2 dòng) Các câu lệnh dưới đây cũng xuất dữ liệu ramáyin nhưng sẽ in từng dòng một: prn << “\nTong = “ << (4+9) << flush ; // In một dòng prn << “\nTich = “ << (4*9) ; << flush // Indòng thứ hai Ví dụ 2: Các câu lệnh char buf[1000] ; ofstream prn(4,buf,1000) ; sẽ tạo dòngtinxuất prn và gắn nó với máyin chuẩn. Dòngxuất prn sử dụng 1000 byte của mảng buf làm bộ đệm. Các câu lệnh dưới đây cũng xuất dữ liệu ramáy in: prn << “\nTong = “ << (4+9) ; // Đưa dữ liệu vào bộ đệm prn << “\nTich = “ << (4*9) ; // Đưa dữ liệu vào bộ đệm prn.flush() ; // Xuất 2 dòng (ở bộ đệm) ramáyin Chú ý: Trước khi kết thúc chương trình, dữ liệu từ bộ đệm sẽ được tự động đẩy ramáy in. Chương trinh minh hoạ: Chương trình dưới đây tương tự như chương trình trong mục 7.3 (chỉ sửa đổi phương thức xuất) nhưng thay việc xuấtra màn hình bằng xuấtramáy in. //CT7_08B.CPP // Xuatramayin // Bo phan dinh dang // Ham dinh dang #include <iostream.h> #include <iomanip.h> #include <conio.h> struct TS { int sobd; char ht[25]; float dt,dl,dh,td; } ; class TSINH { private: TS *ts; int sots; public: TSINH() { ts=NULL; sots=0; } TSINH(int n) { ts=new TS[n+1]; sots=n; } ~TSINH() { if (sots) { 394 sots=0; ts = NULL; } } void nhap(); void sapxep(); void xuat(); } ; void TSINH::nhap() { if (sots) for (int i=1; i<=sots; ++i) { cout << "\nThi sinh "<< i << ": " ; cout << "\nSo bao danh: " ; cin >> ts[i].sobd; cin.ignore(); cout << "Ho ten: " ; cin.get(ts[i].ht,25); cout << "Diem toan, ly , hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh; ts[i].td = ts[i].dt + ts[i].dl + ts[i].dh; } } void TSINH::sapxep() { int i,j; for (i=1; i< sots; ++i) for (j=i+1; j<= sots; ++j) if (ts[i].td < ts[j].td) { TS tg; tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } } void TSINH::xuat() { 396 ostream prn(4); if (sots) { prn << "\nDanh sach thi sinh:" ; prn.precision(1); prn << setiosflags(ios::left); prn << "\n" << setw(20) <<"Ho ten" << setw(8) << "So BD"<< setw(10) << "Tong diem"; for (int i=1; i<=sots; ++i) prn << "\n" << setw(20)<<setiosflags(ios::left) <<ts[i].ht << setw(4) << setfill('0')<<setiosflags(ios::right)<< ts[i].sobd << " " << setfill(32) <<setiosflags(ios::left|ios::showpoint) <<setw(10)<< ts[i].td; } } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n); t->nhap() ; t->sapxep(); t->xuat(); getch(); delete t; } . Xuất ra máy in Trong số 4 dòng tin chuẩn không dòng nào gắn với máy in. Như vậy không thể dùng các dòng này để xuất dữ liệu ra máy in. Để xuất dữ. Tên _dòng_ tin( int fd) ; ofstream Tên _dòng_ tin( int fd, char *buf, int n) ; Trong đó: + Tên _dòng_ tin là tên biến đối tượng kiểu ofstream hay gọi là tên dòng xuất