2009-10-30 32 views
28

Tôi muốn mở một tệp để đọc. Tuy nhiên, trong bối cảnh của chương trình này, nó là OK nếu tập tin không tồn tại, tôi chỉ cần di chuyển trên. Tôi muốn để có thể xác định khi lỗi là "tập tin không tìm thấy" và khi lỗi là nếu không. Nếu không có nghĩa là tôi cần phải thoát và lỗi.ifstream: làm thế nào để biết nếu tập tin được chỉ định không tồn tại

Tôi không thấy cách rõ ràng để thực hiện việc này với fstream.


Tôi có thể làm điều này với C's open()perror(). Tôi cho rằng có một cách fstream để thực hiện việc này.

Trả lời

5

Từ kết quả của việc mở một tập tin là hệ điều hành cụ thể, tôi không nghĩ rằng tiêu chuẩn C++ có bất kỳ cách nào để phân biệt các loại lỗi khác nhau. Tệp mở hoặc không.

Bạn có thể thử mở tệp để đọc và nếu tệp không mở, bạn biết nó không tồn tại hoặc một số lỗi khác đã xảy ra. Sau đó, một lần nữa, nếu bạn cố gắng mở nó để viết sau đó và nó không thành công, có thể nằm trong thể loại "cái gì khác".

36

Tôi không nghĩ rằng bạn có thể biết nếu "tệp không tồn tại". Bạn có thể sử dụng is_open() để kiểm tra chung:

ofstream file(....); 
if(!file.is_open()) 
{ 
    // error! maybe the file doesn't exist. 
} 

Nếu bạn đang sử dụng boost bạn có thể sử dụng boost::filesystem:

#include <boost/filesystem.hpp> 
int main() 
{ 
    boost::filesystem::path myfile("test.dat"); 

    if(!boost::filesystem::exists(myfile)) 
    { 
     // what do you want to do if the file doesn't exist 
    } 
} 
+6

nó không phải là của dòng mà là ifstream! – Phong

+0

Lưu ý rằng cả hai cách kiểm tra điều gì đó khác: tệp có thể ở đó nhưng bạn có thể không có các quyền cần thiết ... – rubenvb

+3

Đây có phải là giải pháp vốn có không? –

5

Bạn có thể sử dụng các chỉ số, mà phải là trên nền tảng di động và đang trong thư viện C chuẩn:

#include <sys/stat.h> 

bool FileExists(string filename) { 
    struct stat fileInfo; 
    return stat(filename.c_str(), &fileInfo) == 0; 
} 

Nếu stat trả về 0, các tập tin (hoặc thư mục) tồn tại, nếu không nó không. Tôi giả sử rằng bạn sẽ phải có quyền truy cập vào tất cả các thư mục trong đường dẫn của tệp. Tôi đã không thử nghiệm tính di động, nhưng this page cho thấy nó không phải là một vấn đề.

+0

Nên kiểm tra mã trả về, vì nó có thể khác không vì các lý do khác ngoài tệp không tồn tại. Xem http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw

+2

Đây là một điều WRONG để làm, bởi vì trong thời gian SAU KHI stat() trả về và TRƯỚC 'fstream''s open() phải thực sự mở một tệp mà tệp có thể đã bị xoá (bị xóa bởi một tiến trình khác trong hệ thống). – PowerGamer

+0

http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c – Ethan

39

EDIT: Tôi đã được thông báo rằng điều này không nhất thiết cho biết tệp không tồn tại vì nó có thể bị gắn cờ do quyền truy cập hoặc các sự cố khác.

Tôi biết tôi cực kỳ muộn trong việc trả lời câu hỏi này, nhưng tôi nghĩ tôi sẽ để lại nhận xét cho bất kỳ ai duyệt web. Bạn có thể sử dụng chỉ báo lỗi của ifstream để biết tệp có tồn tại hay không.

ifstream myFile("filename.txt"); 
    if(myFile.fail()){ 
     //File does not exist code here 
    } 
//otherwise, file exists 
+2

Cảm ơn câu trả lời "muộn" đó! Tôi đã thực sự hữu ích để đăng nó;) – ezdazuzena

+0

Rất hữu ích! Cảm ơn rất nhiều –

+2

Điều bạn đề xuất KHÔNG PHẢI là cách để kiểm tra "tệp không tìm thấy". 'fail()' không chỉ ra "tập tin không tồn tại", nó chỉ cho biết "có gì sai". Trong ví dụ cụ thể của bạn nó có thể là "truy cập bị từ chối" hoặc "vi phạm chia sẻ" vv – PowerGamer

0

Chức năng std::fstream::good() lợi nhuận false khi tập tin không tồn tại. Không đủ rồi sao?

std::fstreamkế thừa chức năng này từ std::ios.

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