我对某些fwrite有问题,但我无法理解。

在这段代码中,fwrite都会失败,并且tmp = 0。

  if ((file = fopen(filenameout, "wb")) != NULL)
  {
    bmpheader->filesz += bmpdib->bmp_bytesz;
    bmpdib->bmp_bytesz *= 2;
    bmpdib->height *= 2;
    tmp = fwrite(bmpheader, sizeof(bmp_header_t), 1, file);
    tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),    1, file);
    tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz,   1, file);
    tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz,   1, file);

    fclose(file);
  }
  else
    return 1;


但是,如果我注释一行代码,一切都会很好:

      if ((file = fopen(filenameout, "wb")) != NULL)
      {
        bmpheader->filesz += bmpdib->bmp_bytesz;
//        bmpdib->bmp_bytesz *= 2;
        bmpdib->height *= 2;
        tmp = fwrite(bmpheader, sizeof(bmp_header_t), 1, file);
        tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),    1, file);
        tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz,   1, file);
        tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz,   1, file);

        fclose(file);
      }
      else
        return 1;


我仔细检查了代码中的每个细节:


bmpdata1和bmpdata2包含有效的bmp位图数据,如果单独使用,它们都会产生正确的图像。
bmpheader和bmpdib是从有效的bmp文件读取的数据结构,直到我的代码被修改为止。
所有文件均已以二进制模式“ rb”打开,以供输入,以“ wb”打开输出。
bmpdata1和bmpdata2是同一图像的副本,因此它们的字节大小相同。


我的代码的目标是编写一张图像及其修改后的副本,以获得最终图像,该图像是原始图像的两倍。原始位图是570 x 363 x 24位bmp图像。

我究竟做错了什么?

非常感谢您的任何帮助。

最佳答案

这样就解决了问题。感谢艺术。

  if ((file = fopen(filenameout, "wb")) != NULL)
  {
    bmpheader->filesz += bmpdib->bmp_bytesz;
    bmpdib->bmp_bytesz *= 2;
    bmpdib->height *= 2;
    tmp = fwrite(bmpheader, sizeof(bmp_header_t),   1, file);
    tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),      1, file);
    tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz / 2, 1, file);
    tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz / 2, 1, file);

    fclose(file);
  }
  else
    return 1;


我错误地使用了更新的位图数据大小来写入最终图像的每个部分。生成的图像具有两倍的高度,因为它是由两个堆叠的图像组成的,每个图像都是通过单独的“ fwrite”操作写入的,每个图像的位图数据大小只有一半。

关于c - fwrite失败取决于先前的fwrite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26908086/

10-12 23:40