Кожен системний виклик, який не вдається оновити errnoзначення.
Таким чином, ви можете отримати більше інформації про те, що відбувається, коли ifstreamвідкриття не працює, використовуючи щось на зразок:
cerr << "Error: " << strerror(errno);
Однак, оскільки кожен системний виклик оновлює глобальне errnoзначення, у вас може виникнути проблема в багатопотоковій програмі, якщо інший системний виклик викликає помилку між виконанням f.openта використанням errno.
У системі зі стандартом POSIX:
errno є локальним для потоку; встановлення його в одному потоці не впливає на його значення в будь-якому іншому потоці.
Редагувати (дякую Арне Мерцу та іншим людям у коментарях):
e.what() спочатку здавалося, що це C ++ - ідіоматичніше правильний спосіб реалізації цього, однак рядок, повернутий цією функцією, залежить від реалізації, і (принаймні в libstdc ++ G ++) цей рядок не має корисної інформації про причину помилки ...