В программе на 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", что вполне разумно. Использование оператора >> вызывает исключение потери значимости, что тоже нормально.
Теперь у меня вопрос: как я могу определить, что пользователь ввел имя каталога вместо правильного имени файла? Есть ли способ сделать это? Получение и возврат байтов из потока кажутся утомительными и подверженными ошибкам.
Кроме того, почему это так? Я понимаю, что с точки зрения программы это одни и те же данные, но я предполагаю, что ОС также отправит сообщение типа «эй, это каталог».