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
Chương 8
Nhập / Xuất C++
nâng cao
// program codes
return stream
}
manip_name
tên của bộ thao tác được tạo ra
Lưu ý : bộ thao tác trên có đối số là một tham chiếu đến stream mà nó thao tác, khi
gọi bộ này, không được kèm theo tên bộ thao tác bất kỳ một đối số nào. •
Dạng tổng quát của các
bộ thao tác nhập không có tham số
:
istream &manip_name(istream &stream)
{
// program codes
return stream
}
Chương 8
Nhập / Xuất C++
nâng cao
setup
<< 123.123456;
return 0;
}
Kết qủa chương trình
**123.1234 Ví dụ 1.2
Hai bộ thao tác atn() và note() đơn giản sau đây làm gọn hơn đoạn
chương trình in các từ hay đoạn câu hay lặp lại trong chương trình.
#include <iostream.h>
// Attention:
ostream &atn(ostream &stream)
{
stream << "Attention: ";
return stream;
}
Chương 8
Nhập / Xuất C++
nâng cao
231
cout << '\a'; // sound bell
cout << "Enter password: ";
return
stream
;
}
int main()
{
char pw[80];
do {
cin >>
getpass
>> pw;
Chương 8
Nhập / Xuất C++
nâng cao
232
} while (strcmp(pw, "password"));
cout << "Logon complete\n";
return 0;
Chương 8
Nhập / Xuất C++
nâng cao
233
II/ Nhập/Xuất File
1/ Khái niệm
Để sử dụng nhập/xuất file trong chương trình cần phải nạp file
fstream.h
. File này
đònh nghiã nhiều lớp gồm
ifstream
,
ofstream
và
fstream
. Ba lớp này được suy dẫn
từ hai lớp istream và ostream, và ios là lớp cơ sở của chúng. Do đó các lớp ifstream,
ofstream và fstream cũng có thể truy xuất đến tất cả các thao tác đã đònh nghóa trong
ios
.
Trong C++,
fstream
io
; // input and output stream
2/ Mở file
a/ Sau khi tạo ra một stream, có thể
mở file gắn với stream đó bằng
hàm open()
.
Hàm này là hàm thành phần của ba stream nói trên, dạng tổng quát :
void
open
(const char
*filename
, int
mode
, int
access
);
filename
tên của file cần mở, có thể đi kèm với đường dẫn.
mode
xác đònh chế độ của file được mở.
access
xác đònh cách truy cập file @ Các
giá trò nguyên của mode
, có thể là một hay nhiều giá trò (được kế thừa bởi
. Chế độ
ios::out
xác đònh
file
được mở là file xuất
.
Tuy nhiên, việc tạo ra một stream bằng các khai báo nó thuộc lớp ifstream ngầm
đònh nó là một stream nhập, cũng như khai báo stream thuộc lớp ofstream ngầm
đònh nó là một stream xuất. Trong hai trường hợp trên, không cần phải xác đònh các
giá trò ios::in và ios::out khi mở file.
•
Chế độ
ios::binary
làm cho
file được mở ở chế độ nhò phân
.
Theo mặc đònh, tất cả các file được mở ở chế độ văn bản (text mode). Trong chế độ
văn bản, sẽ có một số trường hợp ký tự sẽ bò chuyển đổi. Ví dụ,
ký tự tạo dòng mới
(
'\n' ) sẽ được chuyển thành chuổi liên tiếp nhau của hai
ký tự xuống dòng
(carriage
return, mã 13), và thêm một dòng (line-feed, mã 10).
Khi hoạt động
ở chế độ nhò phân, sẽ không có bất kỳ một trường hợp chuyển đổi ký tự
filebuf
là lớp cha của các
lớp stream). Trong môi trường UNIX nó có giá trò 0x644 đối với các file thông
thường.
Trong môi trường DOS/WINDOWS giá trò của đối số access qui đònh mã thuộc tính
của file, bao gồm :
Chương 8
Nhập / Xuất C++
nâng cao
235 Thuộc tính Ý nghiã
0 Archive File bình thường : ghi / đọc (mặc đònh)
1 Read only File chỉ đọc
2 Hidden File ẩn
4 System File hệ thống
8 Save Thuộc tính lưu trữ Có thể sử dụng kết hợp hai hay nhiều thuộc tính ở trên bằng phép toán OR. •
đó, cần kiểm tra lại việc mở file có thành công hay không, trước khi truy xuất nó. Ví
dụ :
if(! mystream) {
cout << "Can't open file \n";
// handle error
} b/ Dùng hàm tạo để mở file
Chương 8
Nhập / Xuất C++
nâng cao
236
Thông thường, không cần dùng hàm open() để mở file, vì các lớp
ifstream
,
ofstream
và
fstream
đã có sẵn các hàm tạo dùng để mở file một cách tự động.
Các
hàm tạo này có các đối số giống hệt như của hàm open(). Dạng thông thường
mở file
Ví dụ
mystream.eof()
; 4/ Truy xuất nội dung trên file
Toán tử xuất << và toán tử nhập >> được sử dụng để truy xuất nội dung trên file,
cần phải thay các stream cin và cout bằng stream liên kết với file.
Thông tin lưu trên file
có cùng đònh dạng
như khi nó được trình bày trên màn hình.
Do đó, các
file tạo ra
bằng toán tử xuất << và các
file được đọc vào
bằng toán tử
nhập >> đều là các
file văn bản có đònh dạng
. Ví dụ 2.1
Tạo một file xuất, ghi lên file, đóng file. Mở file đó như một file nhập,
đọc nội dung của file.
#include <iostream.h>
#include <fstream.h>
Chương 8
Nhập / Xuất C++
ifstream fin
("test.txt"); // open input file
if(!fin) {
cout << "Cannot open input file.\n";
return 1;
}
char str[80];
int i, j; fin >>
str >> i >> j;
cout << str << ' ' << i << ' ' << j << endl; fin.close()
;
return 0;
} Kết quả chương trình, nội dung trong file test.txt
Chương 8
Nhập / Xuất C++
return 1;
} ofstream out(argv[1])
; // output file
if(!out) {
cout << "Cannot open output file.\n";
return 1;
}
char str[80];
cout << "Write strings to disk, '$' to stop\n";
do {
cout << ": ";
cin >> str;
out << str
<< endl;
Chương 8
Nhập / Xuất C++
nâng cao
239
fout(argv[2])
; // create output file to write
if(!fout) {
cout << "Cannot open output file.\n";
return 1;
}
if(!fin) {
cout << "Cannot open input file.\n";
return 1;
}
char ch; fin.unsetf(ios::skipws)
; // do not skip spaces
Chương 8
Nhập / Xuất C++
nâng cao
240
while(!fin.eof()) {
fin >> ch
III/ Nhập/Xuất File nhò phân không đònh dạng
Việc nhập/xuất file nhò phân không đònh dạng
linh động hơn
nhập/xuất text file.
Chương 8
Nhập / Xuất C++
nâng cao
241
1/ Các hàm nhập/xuất cấp thấp
•
Đọc ghi từng ký tự
Dạng phổ biến của chúng : istream &get
(char
&
ch);
Hàm write() ghi một số lượng
num
các byte ở vùng đệm được trỏ bởi
buf
đến stream
tương ứng.
Nếu file được đọc hết trước khi đủ num ký tự, hàm read() hoàn tất bình thường và
vùng đệm chứa hết số ký tự của lần đọc cuối. Để biết lần cuối này có bao nhiêu ký
tự được đưa ra vùng đệm, dùng hàm gcount() có dạng
int gcount();
Hàm sẽ trả về giá trò là tổng số ký tự đọc được ở lần đọc cuối ngay trước khi hết file.
Lưu ý
: việc thiết lập chế độ
ios::binary
chỉ nhằm mục đích ngăn ngừa việc chuyển
đổi ký tự. Khi sử dụng các hàm nhập/xuất file nhò phân không đònh dạng, không cần
mở file ở chế độ
ios::binary.Ví dụ 3.1
Chương trình xuất nội dung của một file bất kỳ ra màn hình
// PR.CPP
Chương 8
if(!in) {
cout << "Cannot open file.\n";
return 1;
}
while(!in.eof()) {
in.get(ch)
;
cout << ch;
}
in.close();
return 0;
} Ví dụ 3.2
Chương trình ghi các ký tự lên một file cho đến khi người dùng nhập
vào ký tự '$' .
// WRITE.CPP
#include <iostream.h>
#include <fstream.h>
int main(
int argc, char *argv[]
)
{
char ch;