在C中使用bmp文件时,为什么fopenf_s会将文件指针初始化为NULL?

时间:2019-06-14 08:53:13

标签: c file pointers fopen bmp

我正在尝试写入现有的bmp文件。 该操作应删除其上的数据,这对我来说很好。 首先,我想读取原始标题,然后切换宽度和高度数据,然后使用新标题“创建”新文件。 由于某种原因,我设法以“ rb”模式打开和读取文件,但是当我尝试以“ wb”模式或任何其他写入模式打开文件时,文件指针被初始化为NULL。

使用struct BmpHeader读取可以正常工作。

更新: 使用后:

   err = fopens(...);

我得到了err = 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 个答案:

答案 0 :(得分:1)

fopen_s()返回一个非零的错误代码,并在发生错误时将文件句柄设置为null,并将全局值errno设置为适当的错误代码。要查看发生了什么,请使用perror()打印错误消息:

if (fopen_s(&f, "plate.bmp", "wb") != 0) {
    perror("could not open plate.bmp");

    // Exit or return.
}

perror()会将系统错误附加到您自己的消息中,并在其前面加上:

打开文件进行读取时,也请执行相同的操作。永远不要假设文件操作将成功。您真的真的在执行任何类型的I / O时都需要进行错误处理。

如果错误是“权限被拒绝”,则通常意味着文件在其他位置打开。可以在您自己的程序中,也可以通过外部程序(例如,用于检查bmp文件的图像查看器)关闭它。在Windows上,如果文件也在其他位置打开,则无法以写入模式打开文件。

如果要避免忘记关闭文件的情况,则应使用C ++中的RAII工具。可以说,它是C ++最重要和最有用的部分。在这种情况下,您可以切换到C ++流,或者如果您想继续使用cstdio API,然后将文件句柄包装为您自己的类型,当超出范围时它会自动关闭该句柄(在析构函数,也可以使用自定义删除程序设置为unique_ptr的{​​{1}}。)