2010-03-06 42 views
31

Có cách nào dễ dàng để kiểm tra xem tệp có trống không. Giống như nếu bạn đang chuyển một tập tin vào một chức năng và bạn nhận ra nó có sản phẩm nào, sau đó bạn đóng nó ngay lập tức? Cảm ơn.Kiểm tra tệp trống trong C++

Chỉnh sửa, tôi đã thử sử dụng phương pháp fseek, nhưng tôi gặp lỗi khi nói 'không thể chuyển đổi ifstream thành FILE *'.

tham số chức năng của tôi là

myFunction(ifstream &inFile) 
+0

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 –

Trả lời

50

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 
+0

sẽ không quá khó để thêm 'return pFile.tellg()> 0 || … ' – Potatoswatter

+1

Câu trả lời ... – IssamTP

5

Seek đến cuối của tập tin và kiểm tra vị trí:

fseek(fileDescriptor, 0, SEEK_END); 
if (ftell(fileDescriptor) == 0) { 
    // file is empty... 
} else { 
    // file is not empty, go back to the beginning: 
    fseek(fileDescriptor, 0, SEEK_SET); 
} 

Nếu bạn không có tập tin mở đã có, chỉ cần sử dụng fstat chức năng và kiểm tra kích thước tệp trực tiếp.

0
pFile = fopen("file", "r"); 
fseek (pFile, 0, SEEK_END); 
size=ftell (pFile); 
if (size) { 
    fseek(pFile, 0, SEEK_SET); 
    do something... 
} 

fclose(pFile) 
+1

định dạng mã bằng nút thanh công cụ trông giống như '100110' – t0mm13b

+0

Mã vụng về. Không được khuyến khích. – SmallChess

7

Ok, vì vậy đoạn mã này sẽ phù hợp với bạn. Tôi đã đổi tên để khớp với thông số của bạn.

inFile.seekg(0, ios::end); 
if (inFile.tellg() == 0) {  
    // ...do something with empty file... 
} 
1
char ch; 
FILE *f = fopen("file.txt", "r"); 

if(fscanf(f,"%c",&ch)==EOF) 
{ 
    printf("File is Empty"); 
} 
fclose(f); 
+1

Tại sao bạn sử dụng các thành ngữ C này trong C++? –

0

Làm thế nào về (cách không thanh lịch mặc dù)

int main(int argc, char* argv[]) 
{ 
    std::ifstream file; 
    file.open("example.txt"); 

    bool isEmpty(true); 
    std::string line; 

    while(file >> line) 
     isEmpty = false; 

     std::cout << isEmpty << std::endl; 
} 
+1

Đủ công bằng. Nó tốt hơn một chút (do là _actual_ C++, không phải C) so với user4471014, mặc dù vẫn hoàn toàn lãng phí và tối ưu. –

+0

@LightnessRacesinOrbit, bạn nói đúng, tuy nhiên không cần phải đi qua tất cả các dòng của một tập tin.Vòng lặp while có thể dừng lại khi dòng đầu tiên được phát hiện và đặt 'isEmpty' thành' false'. Nếu điều đó có thể tăng cường mã. – CroCo

+0

Tôi có thể hiểu mã này là tối ưu nhưng tại sao nó lãng phí? OP không yêu cầu hoặc tìm kiếm mã tối ưu hoặc đủ. – CroCo

-1
if (nfile.eof()) // Prompt data from the Priming read: 
    nfile >> CODE >> QTY >> PRICE; 
else 
{ 
    /*used to check that the file is not empty*/ 
    ofile << "empty file!!" << endl; 
    return 1; 
} 
+1

Mặc dù điều này có thể cung cấp giải pháp cho câu hỏi của OP nhưng không có giải thích về mã. –

1

sử dụng này: data.peek() = '\ 0! '

Tôi đã tìm kiếm một giờ cho đến khi hoàn thành điều này đã giúp!

+0

Làm thế nào là điều này tốt hơn so với câu trả lời được chấp nhận? – Norrius

Các vấn đề liên quan