Ifstream open() не устанавливает биты ошибки, когда аргументом является каталог

В программе на C++, используя std::ifstream, я пытаюсь открыть указанный пользователем файл — пока так. хорошо. Однако я случайно ввел имя файла, которое на самом деле является каталогом, и был очень удивлен, увидев, что попытка open() этого каталога не привела к ошибкам.

Вот минимальный пример:

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;
}

Здесь нет признаков ошибки. Если я продолжу и попытаюсь getline(), getline() установит бит ошибки в порядке.

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;

Это выводит «getline set badbit», что разумно. Использование оператора >> вызывает исключение потери значимости, что тоже нормально.

Теперь мой вопрос: как определить, что пользователь ввел имя каталога вместо правильного имени файла? Есть ли способ сделать это? Получение и удаление байтов из потока кажется утомительным и подверженным ошибкам.

Кроме того, почему это так? Я понимаю, что это одни и те же данные с точки зрения программы, но я предполагаю, что ОС также отправит сообщение типа «эй, это каталог».

9
задан SáT 6 March 2012 в 20:07
поделиться