Nhập / Xuất nhị phân:
Khái niệm về 2 loại tập tin: văn bản và nhị phân
Tập tin văn bản:
Trong file văn bản mỗi byte được xem là một kí tự. Tuy nhiên nếu 2 byte 10 (LF), 13 (CR) đi liền nhau thì được xem là một kí tự và nó là kí tự xuống dòng. Như vậy file văn bản là một tập hợp các dòng kí tự với kí tự xuống dòng có mã là 10. Kí tự có mã 26 được xem là kí tự kết thúc file.
Tập tin nhị phân:
Thông tin lưu trong file được xem như dãy byte bình thường. Mã kết thúc file được chọn là -1, được định nghĩa là EOF trong stdio.h. Các thao tác trên file nhị phân thường đọc ghi từng byte một, không quan tâm ý nghĩa của byte. Một số các thao tác nhập/xuất sẽ có hiệu quả khác nhau khi mở file dưới các dạng khác nhau.
Ví dụ :
Giả sử ch = 10, khi đó f << ch sẽ ghi 2 byte 10,13 lên file văn bản f, trong khi đó lệnh này chỉ khi 1 byte 10 lên file nhị phân.
Ngược lại, nếu f là file văn bản thì f.getc(ch) sẽ trả về chỉ 1 byte 10 khi đọc được 2 byte 10, 13 liên tiếp nhau.
Một file luôn ngầm định dưới dạng văn bản, do vậy để chỉ định file là nhị phân ta cần sử dụng cờ ios::binary.
Đọc, ghi ký tự
- put(c); // ghi kí tự ra file
- get(c); // đọc kí tự từ file
Ví dụ : Sao chép file 1 sang file 2. Cần sao chép và ghi từng byte một do vậy để chính xác ta sẽ mở các file dưới dạng nhị phân.
include <iostream.h>
include <fstream.h>
include <stdlib.h>
include <conio.h>
void main()
{
clrscr();
fstream fnguon("DATA1", ios::in | ios::binary);
fstream fdich("DATA2", ios::out | ios::binary);
char ch;
while (!fnguon.eof()) {
fnguon.get(ch);
fdich.put(ch);
}
fnguon.close();
fdich.close();
}
Đọc, ghi dãy ký tự:
- write(char *buf, int n); // ghi n kí tự trong buf ra dòng xuất
- read(char *buf, int n); // nhập n kí tự từ buf vào dòng nhập
- gcount(); // cho biết số kí tự read đọc được
Ví dụ: Chương trình sao chép file ở trên có thể sử dụng các phương thức mới này như sau:
include <iostream.h>
include <fstream.h>
include <stdlib.h>
include <conio.h>
void main()
{
clrscr();
fstream fnguon("DATA1", ios::in | ios::binary);
fstream fdich("DATA2", ios::out | ios::binary);
char buf[2000] ;
int n = 2000;
while (n) {
fnguon.read(buf, 2000);
n = fnguon.gcount();
fdich.write(buf, n);
}
fnguon.close();
fdich.close();
}