Có lẽ một cái gì đó tương tự như:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
ngắn và ngọt ngào.
Với mối quan tâm đến lỗi lầm của mình, những câu trả lời khác sử dụng truy cập tập tin C-phong cách, nơi bạn có được một FILE*
với các chức năng cụ thể.
Ngược lại, bạn và tôi đang làm việc với luồng C++ và do đó không thể sử dụng các chức năng đó. Đoạn mã trên hoạt động theo cách đơn giản: peek()
sẽ xem nhanh luồng và quay lại mà không xóa, ký tự tiếp theo. Nếu nó đến cuối tập tin, nó trả về eof()
. Ergo, chúng tôi chỉ peek()
ở luồng và xem đó là eof()
, vì một tệp trống không có gì để xem.
Lưu ý, điều này cũng trả về true nếu tệp không bao giờ được mở ở địa điểm đầu tiên, điều này sẽ hoạt động trong trường hợp của bạn. Nếu bạn không muốn điều đó:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Thật tệ khi bạn không thể dễ dàng lấy một bộ mô tả tệp từ 'fstream'. Bạn có thể dễ dàng kiểm tra một tập tin rỗng bằng cách sử dụng 'fstat', trên Unix. :-P –