Trong chương trình C++, sử dụng std :: ifstream, tôi đang cố mở một tệp do người dùng chỉ định - cho đến nay rất tốt. Tuy nhiên, tôi vô tình nhập tên tệp thực sự là một thư mục và tôi khá ngạc nhiên khi thấy rằng cố gắng mở() thư mục đó không tạo ra bất kỳ lỗi nào.Ifstream open() không đặt bit lỗi khi đối số là một thư mục
Dưới đây là một ví dụ nhỏ:
std::ifstream f;
f.open("..");
if(!f.is_open() || !f.good() || f.bad() || f.fail()) {
std::cout << "error bit set on open" << std::endl;
return 1;
}
Không có dấu hiệu của lỗi ở đây. Nếu tôi tiếp tục và cố gắng để getline(), getline() thiết lập một bit lỗi tất cả các quyền.
std::string str;
getline(f, str);
if(f.eof()) std::cout << "getline set eofbit" << std::endl;
else if(f.bad()) std::cout << "getline set badbit" << std::endl;
else if(f.fail()) std::cout << "getline set failbit" << std::endl;
Kết quả này "getline set badbit", điều này là hợp lý. Sử dụng toán tử >> đưa ra một ngoại lệ tràn, điều này cũng ổn.
Bây giờ, câu hỏi của tôi là, làm thế nào tôi có thể phát hiện ra rằng người dùng đã nhập tên thư mục thay vì tên tệp thích hợp? Có cách nào để làm điều đó? Bắt và không đặt byte từ luồng dường như tẻ nhạt và dễ bị lỗi.
Ngoài ra, tại sao lại như vậy? Tôi nhận ra rằng đó là tất cả chỉ là cùng một dữ liệu từ quan điểm của chương trình, nhưng tôi cho rằng hệ điều hành cũng sẽ gửi một số "hey, đây là một thư mục" loại tin nhắn.
Bạn đang nhận hành vi này trên nền tảng nào? –
C++ không có khái niệm "thư mục". Bạn cần một số thư viện nền tảng cụ thể (như Posix hoặc Windows). –
Ồ, Ubuntu 10.04, trình biên dịch là gcc 4.4.3. –