fopen_s () возвращает ненулевой код ошибки и устанавливает дескриптор файла равным нулю, а глобальное значение errno - соответствующему коду ошибки при возникновении ошибки. Чтобы увидеть, что произошло, используйте perror () , чтобы напечатать сообщение об ошибке:
if (fopen_s(&f, "plate.bmp", "wb") != 0) {
perror("could not open plate.bmp");
// Exit or return.
}
perror()
добавит системную ошибку к вашему собственному сообщению с :
перед ним.
Также сделайте то же самое при открытии файла для чтения. Никогда не предполагайте, что файловые операции будут успешными. Вы действительно действительно должны выполнять обработку ошибок при выполнении любых операций ввода-вывода.
Если ошибка «разрешение запрещено», то это обычно означает, что файл открыт в другом месте. Либо в вашей собственной программе, либо с помощью внешней программы (например, просмотрщик изображений, который вы используете для проверки файла BMP.) Закройте его. В Windows вы не можете открывать файлы в режиме записи, если они открыты и в других местах.
Если вы хотите избежать ситуаций, когда вы забыли закрыть файлы, вы должны использовать RAII средства в C ++. Это, пожалуй, самая важная и полезная часть C ++. В этом случае вы можете либо переключиться на потоки C ++, либо, если вы хотите продолжить использовать API cstdio
, а затем обернуть дескрипторы файлов своим собственным типом, который автоматически закрывает дескриптор, когда он выходит из области видимости (либо в деструкторе). или с помощью unique_ptr
с пользовательским средством удаления, установленным на fclose
.)