Nhậpxuấtnhịphân 15.1. Chọn kiểu nhậpxuấtnhịphân Kiểu nhậpxuất mặc định là văn bản. Để chọn kiểu nhậpxuấtnhị phân, thì trong tham số mode (của hàm tạo dạng 2 và phương thức open) cần chứa giá trị: ios::binary Ví dụ muốn mở tệp “DSTS.DL” để đọc-ghi theo kiểu nhịphân và gắn tệp với dòng nhập- xuất fs , ta dùng câu lệnh sau: fstream fs(“DSTS.DL” , ios::in | ios::out | ios::binary) ; 15.2. Đọc, ghi ký tự + Để ghi một ký tự lên tệp có thể dùng phương thức: ostream & put(char) ; + Để đọc một ký tự từ tệp có thể dùng phương thức: istream & get(char &) ; Cần chú ý rằng: Cách đọc ghi ký tự theo kiểu văn bản khác với cách đọc ghi ký tự theo kiểu nhịphân (xem chương 10, cuốn Kỹ thuật lập trình C của tác giả) Ví dụ để sao tệp có thể dùng thuật toán đơn giản sau: + Đọc một ký tự từ tệp nguồn + Nếu đọc thành công ( phương thức eof() = 0) thì ghi lên tệp đích và lại tiếp tục đọc ký tự tiếp theo. + Nếu đọc không thành công ( phương thức eof() != 0) thì kết thúc. Chú ý là phải dùng kiểu nhậpxuấtnhịphân thì thuật toán mới cho kết quả chính xác. Chương trình sao tệp dưới đây viết theo thuật toán trên. //CT7_15.CPP // Sao tep #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); char tep_nguon[40], tep_dich[40] ; char ch; fstream fnguon, fdich; cout << "\nTen tep nguon: " ; cin >> tep_nguon; cout << "\nTen tep dich: " ; cin >> tep_dich; fnguon.open(tep_nguon,ios::in | ios::binary); fdich.open(tep_dich,ios::out | ios::binary); if (fnguon.bad() || fdich.bad() ) 428 { cout << "\n Loi mo tep nguon hoac dich " ; getch(); exit(1); } while(fnguon.get(ch),!fnguon.eof()) fdich.put(ch) ; fnguon.close(); fdich.close(); cout << "\nHoan thanh" ; getch(); } 15.3. Đọc, ghi một dẫy ký tự theo kiểu nhịphân + Phương thức: ostream & write(char *buf, int n) ; sẽ xuất n ký tự (byte) chứa trong buf ra dòng xuất. + Phương thức: istream & read(char *buf, int n) ; sẽ nhập n ký tự (byte) từ dòng nhập và chứa vào buf. + Phương thức int gcount cho biết số ký tự thực sự đọc được trong phương thức read. Chú ý: Các phương thức write, read chỉ làm việc một cách chính xác trong kiểu nhập-xuất nhị phân. Dưới đây là chương trình sao tệp sử dụng các phương thức write, read và gcount. //CT7_16.CPP // Sao tep dung write, read va gcount #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); char tep_nguon[40], tep_dich[40] ; char buf[5000]; int n; fstream fnguon, fdich; cout << "\nTen tep nguon: " ; cin >> tep_nguon; cout << "\nTen tep dich: " ; cin >> tep_dich; fnguon.open(tep_nguon,ios::in | ios::binary); fdich.open(tep_dich,ios::out | ios::binary); if (fnguon.bad() || fdich.bad() ) { cout << "\n Loi mo tep nguon hoac dich " ; getch(); exit(1); } while(fnguon.read(buf,5000),(n=fnguon.gcount())) fdich.write(buf,n) ; fnguon.close(); fdich.close(); cout << "\nHoan thanh" ; getch(); } 430 . Nhập xuất nhị phân 15.1. Chọn kiểu nhập xuất nhị phân Kiểu nhập xuất mặc định là văn bản. Để chọn kiểu nhập xuất nhị phân, thì trong tham. ios::binary Ví dụ muốn mở tệp “DSTS.DL” để đọc-ghi theo kiểu nhị phân và gắn tệp với dòng nhập- xuất fs , ta dùng câu lệnh sau: fstream fs(“DSTS.DL” , ios::in