Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang54/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   47   48   49   50   51   52   53   54   55

Kiểm tra sự tồn tại của file, kiểm tra hết file


Việc mở một file chưa có để đọc sẽ gây nên lỗi và làm dừng chương trình. Khi xảy ra lỗi mở file, giá trị trả lại của phương thức bad là một số khác 0. Do vậy có thể sử dụng phương thức này để kiểm tra một file đã có trên đĩa hay chưa. Ví dụ:

ifstream f("Bai tap");

if (f.bad()) {

cout << "file Baitap chưa có";

exit(1);

}

Khi đọc hoặc ghi, con trỏ file sẽ chuyển dần về cuối file. Khi con trỏ ở cuối file, phương thức eof() sẽ trả lại giá trị khác không. Do đó có thể sử dụng phương thức này để kiểm tra đã hết file hay chưa.



Chương trình sau cho phép tính độ dài của file Baitap. File cần được mở theo kiểu nhị phân.

#include

#include

#include

#include

void main()

{

clrscr();



long dodai = 0;

char ch;


ifstream f("Baitap", ios::in | ios::binary) ;

if (f.bad()) {

cout << "File Baitap không có";

exit(1);


}

while (!f.eof()) {

f.get(ch));

dodai++;


}

cout << "Độ dài của file = " << dodai;

getch();

}

Đọc ghi đồng thời trên file


Để đọc ghi đồng thời, file phải được gắn với đối tượng của lớp fstream là lớp thừa kế của 2 lớp ifstream và ofstream. Khi đó chế độ phải được bao gồm chỉ định ios::in | ios::out. Ví dụ:

fstream f("Data", ios::in | ios::out) ;

hoặc

fstream f ;



f.open("Data", ios::in | ios::out) ;

Di chuyển con trỏ file


Các phương thức sau cho phép làm việc trên đối tượng của dòng xuất (ofstream).

đối_tượng.seekp(n) ; Di chuyển con trỏ đến byte thứ n (các byte được tính từ 0)

đối_tượng.seekp(n, vị trí xuất phát) ; Di chuyển đi n byte (có thể âm hoặc dương) từ vị trí xuất phát. Vị trí xuất phát gồm:

ios::beg : từ đầu file

ios::end : từ cuối file

ios::cur : từ vị trí hiện tại của con trỏ.



đối_tượng.tellp(n) ; Cho biết vị trí hiện tại của con trỏ.

Để làm việc với dòng nhập tên các phương thức trên được thay tương ứng bởi các tên : seekgtellg. Đối với các dòng nhập lẫn xuất có thể sử dụng được cả 6 phương thức trên.

Ví dụ sau tính độ dài tệp đơn giản hơn ví dụ ở trên.

fstream f("Baitap");

f.seekg(0, ios::end);

cout << "Độ dài bằng = " << f.tellg();

: Chương trình nhập và in danh sách sinh viên trên ghi/đọc đồng thời.

#include

#include

#include

#include

#include

#include

#include

void main() {

int stt ;

char *hoten, *fname, traloi;

int tuoi;

float diem;

fstream f;

cout << "Nhập tên file: "; cin >> fname;

f.open(fname, ios::in | ios::out | ios::noreplace) ;

if (f.bad()) {

cout << "Tệp đã có. Ghi đè (C/K)?" ;

cin.get(traloi) ;

if (toupper(traloi) == 'C') {

f.close() ;

f.open(fname, ios::in | ios::out | ios::trunc) ;

} else exit(1);

}

stt = 0;



f << setprecision(1) << setiosflags(ios::showpoint) ;

// nhập danh sách

while (1) {

stt++;


cout << "\nNhập sinh viên thứ " << stt ;

cout << "\nHọ tên: "; cin.ignore() ; cin.getline(hoten, 25);

if (hoten[0] = 0) break;

cout << "\nTuổi: "; cin >> tuoi;

cout << "\nĐiểm: "; cin >> diem;

f << setw(24) << hoten << endl;

f << setw(4) << tuoi << set(8) << diem ;

}

// in danh sách



f.seekg(0) ; // quay về đầu danh sách

stt = 0;


clrscr();

cout << "Danh sách sinh viên đã nhập\n" ;

cout << setprecision(1) << setiosflags(ios::showpoint) ;

while (1) {

f.getline(hoten,25);

if (f.eof()) break;

stt++;

f >> tuoi >> diem;



f.ignore();

cout << "\nSinh viên thứ " << stt ;

cout << "\nHọ tên: " << hoten;

cout << "\nTuổi: " << setw(4) << tuoi;

cout << "\nĐiểm: " << setw(8) << diem;

}

f.close();



getch();

}

NHẬP/XUẤT NHỊ PHÂN

Khái niệm về 2 loại file: văn bản và nhị phân

File 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.

File 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.

: 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 la 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

: 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

#include

#include

#include

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();

}

1   ...   47   48   49   50   51   52   53   54   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương