почему fopenf_s инициализирует указатель файла на NULL при работе с файлом bmp в C? - PullRequest
2 голосов
/ 14 июня 2019

Я пытаюсь записать в существующий файл BMP.действие должно удалить данные на нем, что меня устраивает.Сначала я хочу прочитать исходный заголовок, затем переключить данные ширины и высоты, а затем «создать» новый файл с новым заголовком.по какой-то причине мне удалось открыть и прочитать файл в режиме «rb», но когда я пытаюсь сделать это в режиме «wb» или в любом другом режиме записи, указатель файла инициализируется как NULL.

чтение с помощью struct BmpHeader работает просто отлично.

Обновление: после использования:

   err = fopens(...);

я получил ошибку = 13. Как я могу это исправить?

#define HEADERSIZE 54

int **Matrix = GivenMatrix;
    FILE *f;
    int row, col,i;
    BmpHeader header;
    long  Newwidth, Newheight;
    int pixelBytesInRow, padding;


    fopen_s(&f, "plate.bmp", "rb");
    fread(&header, HEADERSIZE, 1, f);
    fclose(f);
    Newheight = header.width;
    Newwidth = header.height;
    header.width = Newwidth;
    header.height = Newheight;

    fopen_s(&f, "plate.bmp", "wb");

    fwrite(&header, HEADERSIZE, 1, f);

1 Ответ

1 голос
/ 14 июня 2019

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.)

...