. Xửlýlỗi Khi làm việc với tệp không phải mọi việc đều trôi chẩy mà thường xẩy ra nhiều điều trục trặc, chẳng hạn: 1. Mở một tệp để đọc nhưng tệp không tồn tại. 2. Đọc dữ liệu nhưng con trỏ tệp đã ở cuối tệp 3. Ghi dữ liệu nhưng hết không gian đĩa (đĩa đầy). 4. Tạo tệp nhưng đia hỏng, hoặc đĩa cấm ghi hoặc đĩa đầy. 5. Dùng tên tệp không hợp lệ 6. Định thực hiện một thao tác nhưng tệp lại không được mở ở mode phù hợp để thực hiện thao tác đó. Tóm lại khi làm việc với tệp thường gặp nhiều lỗi khác nhau, nếu không biết cách phát hiện xửlý thì chương trình sẽ dẫn đến rối loạn hoặc cho kết quả sai. Trong lớp ios của C++ có nhiều phương thức cho phép phát hiện lỗi khi làm việc với tệp. Đó là: 1. Phương thức int eof() ; Nếu con trỏ tệp đã ở cuối tệp mà lại thực hiện một lệnh đọc dữ liệu thì phương thức eof() trả về giá trị khác không, trái lại phương thức có giá trị bằng 0. 2. Phương thức int fail() ; Phương thức fail() trả về giá trị khác không nếu lần nhập xuất cuối cùng có lỗi, trái lại phương thức có giá trị bằng 0. 3. Phương thức int bad() ; Phương thức bad() trả về giá trị khác không khi một phép nhập xuất không hợp lệ hoặc có lỗi mà chưa phát hiện được, trái lại phương thức có giá trị bằng 0. 4. Phương thức int good() ; Phương thức good() trả về giá trị khác không nếu mọi việc đều tốt đẹp ( không có lỗi nào xẩy ra). Khi có một lỗi nào đó thì phương thức có giá trị bằng 0. 5. Phương thức void clear() ; dùng để tắt tất cả các bit lỗi. Ví dụ 1. Khi mở tệp để đọc cần kiểm tra xem tệp có tồn tại không. Để làm điều đó, chúng ta có thể dùng đoạn chương sau: char ten_tep[40] ; cout << “\n Cho biết tên tệp: “ ; cin >> ten_tep ; ifstream f(ten_tep); if (f.bad()) { 426 cout << “\n Tệp << ten_tep << “không tồn tại” ; exit(1) ; } Ví dụ 2. Khi tạo tệp mới để ghi cần kiểm tra xem có tạo được tệp hay không. Để làm điều đó, chúng ta có thể dùng đoạn chương sau: char ten_tep[40] ; cout << “\n Cho biết tên tệp: “ ; cin >> ten_tep ; ofstream f(ten_tep); if (f.bad()) { cout << “\n Không tạo được tệp << ten_tep ; exit(1) ; } Ví dụ 3. Để xác định độ dài của tệp, có thể dùng phương thức eof() và thuật toán sau: + Đọc một byte (chú ý phải đọc theo kiểu nhị phân) + Nếu việc đọc thành công ( eof()=0 ) thì cộng thêm một vào bộ đếm. Nếu việc đọc không thành ( eof() != 0 ) thì kết thúc vùng lặp. Thuật toán trên được thể hiện bằng đoạn chương trình sau: ifstream f(ten_tep, ios::in | ios::binary) ; long dem = 0 ; char ch; while (1) { f.get(ch) ; if (!eof()) dem++ ; else break; } . đó. Tóm lại khi làm việc với tệp thường gặp nhiều lỗi khác nhau, nếu không biết cách phát hiện xử lý thì chương trình sẽ dẫn đến rối loạn hoặc cho kết quả. ( không có lỗi nào xẩy ra). Khi có một lỗi nào đó thì phương thức có giá trị bằng 0. 5. Phương thức void clear() ; dùng để tắt tất cả các bit lỗi. Ví dụ