Kiểm tra trạng thái Nhập/Xuất

Một phần của tài liệu Nhập xuất C++ nâng cao (Trang 27 - 32)

Hệ thống nhập/xuất C++ lưu lại thông tin trạng thái kết qủa của mỗi tác vụ nhập/xuất. Trạng thái hiện hành của hệ thống nhập/xuất được mã hoá thành một số nguyên.

Tên cờ Ý nghiã

goodbit là 0 nếu không gặp lỗi là 1 nếu gặp lỗi

eofbit là 0 nếu gặp vị trí hết file

là 1 nếu không gặp vị trí hết file failbit là 0 nếu gặp lỗi loại non-fatal

là 1 nếu không gặp lỗi loại non-fatal badbit là 0 nếu gặp lỗi loại fatal

là 1 nếu không gặp lỗi loại fatal Các cờ trên là hằng kiểu liệt kê được định nghiã trong ios.

• Có hai cách để nhận thông tin trạng thái nhập/xuất C++.

Cách 1 dùng hàm int rdstate() ;

Hàm sẽ trả về giá trị thông tin trạng thái của các cờ báo lỗi dưới dạng một con số nguyên.

Cách 2 dùng một trong các hàm sau :

int bad(); return true nếu cờ failbit là 1 int eof(); return true nếu chưa đến cuối file

int good(); return true nếu tất cả các cờ báo lỗi đều có trị là 0

int fail();

• Khi bắt gặp một lỗi nhập/xuất, sử dụng hàm clear() để xoá lỗi trước khi thực thi tiếp chương trình.

void clear(int flags = 0) ;

Nếu flags bằng 0, tất cả các cờ đều bị xoá về trị 0. Ngược lại, có thể đặt giá trị flags để lập cờ theo ý riêng.

Ví dụ 5.1 Minh hoạ cách sử dụng hàm rdstate() .Chương trình xuất nội dung một text file. Nếu gặp lỗi, chương trình sẽ báo lỗi thông qua hàm checkstatus().

// DISPLAY.CPP #include <iostream.h> #include <fstream.h>

void checkstatus(ifstream &in);

int main(int argc, char *argv[])

{

if(argc != 2) {

cout << "Usage: DISPLAY <filename>\n"; return 1;

}

ifstream in(argv[1]); if(!in) {

cout << "Cannot open input file.\n"; return 1; } char c; while(in.get(c)) { cout << c; checkstatus(in); }

checkstatus(in); // check final status. Error message : EOF encountered

in.close(); return 0; }

///////////////////////////////////////////////////////////////

void checkstatus(ifstream &in) (adsbygoogle = window.adsbygoogle || []).push({});

{

ios::iostate i;

i = in.rdstate();

if(i & ios::eofbit)

cout << "EOF encountered\n"; else

if(i & ios::failbit)

cout << "Non-Fatal I/O error\n"; else

if(i & ios::badbit)

cout << "Fatal I/O error\n"; }

Kết quả chương trình

Thông báo lỗi EOF encountered xuất hiện do khi kết thúc vòng while, lần thực hiện

cuối cùng của hàm checkstatus() tương ứng với trạng thái hết file.

Ví dụ 5.2 Minh hoạ cách sử dụng hàm good() để phát hiện lỗi nhập/xuất . // PR.CPP

#include <iostream.h> #include <fstream.h>

int main(int argc, char *argv[])

{ char ch; if(argc != 2) { cout << "PR: <filename>\n"; return 1; }

ifstream in(argv[1]); if(!in) {

cout << "Cannot open input file.\n"; return 1;

}

while( !in.eof() ) { in.get(ch);

// check for error

if( ! in.good() && !in.eof()) {

cout << "I/O Error...terminating\n"; return 1; } cout << ch; } in.close(); return 0; } Kết quả chương trình

Thông báo lỗi "I/O Error...terminating" sẽ xuất hiện khi có lỗi nhập/xuất trong lúc

xuất nội dung của file có tên <filename> .

Bài tập VI

1. Hãy thêm phần kiểm tra và báo lỗi nhập/xuất vào các chương trình trong các bài tập phần V, chương 8.

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Nhập xuất C++ nâng cao (Trang 27 - 32)