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