PDA

View Full Version : All about File I/O in C++



cuonguyen
29-09-2002, 20:52
Bây giờ chúng ta sẽ "check" xem file có mở được hay không:
Cách 1:
ofstream (ifstream) File("somefile.txt");
if(!File) {
....
}
Cách này đã được sử dụng ở một số ví dụ trước.
Cách 2: Sử dụng hàm fail():
ofstream File("somefile.txt");
if(File.fail())
{
.....
}
Hàm fail() trả về giá trị 0 nếu có lỗi (không mở được file) hay 1 nếu không có lỗi.

Để kiểm tra xem file đã được mở chưa ta dùng hàm is_open(). Hàm trả về 0 nếu file chưa được mở, 1 nếu file đã được mở. Ví dụ:

ofstream File;
File.open("file1.txt");
cout << File1.is_open();

sẽ cho giá trị 1.

4. Kiểm tra cờ trạng thái I/O (I/O status-flag).

Hệ thống I/O trong C++ nắm giữ các thông tin về kết quả của các toán tử I/O. Trạng thái hiện hành được lưu trữ trong một đối tượng kiểu io_state (tương tự open_mode) với nhứng giá trị sau:
+ ios::goodbit: không có lỗi.
+ ios::eofbit: tới cuối file.
+ ios::failbit: lỗi không gây hại (non-fatal).
+ ios::badbit: lỗi gây hại (fatal).

Có hai cách để nhận được thông tin về trạng thái I/O. Cách thứ nhất là gọi hàm rdstate(). Hàm này trả về trạng thái của cờ lỗi. Ví dụ, hàm rdstate() sẽ trả về giá trị ios::goobit nếu không có lỗi... Cách thứ hai là sử dụng một trong các hàm sau:

bool bad() -> 1 nếu có lỗi badbit.
bool eof() -> 1 nếu đến cuối file.
bool fail() ->1 nếu có lỗi failbit.
bool good() ->1 nếu không có lỗi.

Ví dụ:
ofstream File("somefile.txt");
if(File.bad()==1) {
.....
}

Khi một lỗi xảy ra, bạn có thể xoá bỏ lỗi đó (thiết lập lại cờ trạng thái). Để làm việc này bạn dùng hàm clear(arg), với arg là cờ trạng thái mà bạn muốn thiết lập khi có lỗi.

Các ví dụ về cờ trạng thái:
Ví dụ 1: Sử dụng hàm rdstate().
ifstream File("somefile.txt");
if(File.rdstate() == ios::eofbit)
cout << "End of file!\n";
if(File.rdstate() == ios::badbit)
cout << "Fatal I/O error!\n";
if(File.rdstate() == ios::failbit)
cout << "Non-fatal I/O error!\n";
if(File.rdstate() == ios::goodbit)
cout << "No errors!\n";

Ví dụ 2: Sử dụng hàm clear().

#include <fstream.h>
void main()
{
ofstream File("love.txt"); //tạo file love.txt
File.close();
//Việc mở file dưới đây sẽ gây lỗi vì sử dụng open_mode là ios::noreplace
ofstream Test("love.txt",ios::noreplace);
//Lỗi này là lỗi ios::failbit.
if(Test.rdstate() == ios::failbit)
cout << "Error...!\n";
Test.clear(ios::goodbit); //Đặt flag sang trạng thái goodbit.
if(Test.rdstate() == ios::goodbit)
cout << "Fine!\n";
Test.clear(ios::eofbit); //Đặt sang trạng thái eofbit.
if(Test.rdstate() == ios::eofbit)
cout << "EOF!\n";
Test.close();
}