【问题标题】:why would fopenf_s initialize the file pointer to be NULL when working with bmp file in C?为什么在 C 中使用 bmp 文件时 fopenf_s 会将文件指针初始化为 NULL?
【发布时间】:2019-06-14 08:53:13
【问题描述】:

我正在尝试写入现有的 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);

【问题讨论】:

  • 更新:当代码到达 fwrite() 行时 - 程序崩溃,因为文件指针 f 设置为 NULL。
  • 您对文件有写权限吗?
  • 查看fopen_s的返回码,例如errno_t rc; rc = fopen_s(...); if(rc) {printf("fopen_s(plate.bmp): %s\n", strerror(rc)); }
  • 我怎么知道?
  • “程序崩溃,因为文件指针 f 设置为 NULL” - 这就是我们检查返回码的原因,并且 从不 假定文件 i /o 正常工作。

标签: c file pointers fopen bmp


【解决方案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 并将自定义删除器设置为 fclose。)

【讨论】:

  • 错误代码为 13,“权限被拒绝”。我该怎么办?它不是只读文件,我在我自己的电脑上工作。
  • @oofar 更新了答案。检查文件是否在其他地方打开。
  • 非常感谢,在代码中的某个地方我打开了同一个文件但没有关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2017-09-06
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多