首页 > 解决方案 > C++ Windows 编译程序与 Linux 不同的行为

问题描述

我为 Linux 系统编写了一些代码来读取/写入位图文件。

我将此代码传输到 Windows,并尝试使用 Visual Studio 2019 对其进行编译。

我通过打开一个位图文件并保存它的副本来测试我的程序。我发现只有位图图像的前几行被写入文件,文件的其余部分是空白的。(黑色图像颜色。)

我对此感到非常困惑,所以写了一个更简单的程序,它只是转储文件中字节的整数值。

我在一个 32 x 32 位图图像文件上运行此文件,该文件是从 GIMP 保存的,每像素格式为 24 位(R8 G8 B8),并且在兼容性选项中设置了“不写入色彩空间信息”。

我发现下面的代码将数据打印到 about i = 500,然后为文件的其余部分打印零。

该文件如下所示:

城市32x32

它显然不包含大的零区域。

编辑:我编辑了以下代码以添加输出文件。代码下方的屏幕截图显示了生成的输出。

#include <iostream>
#include <fstream>
#include <vector>


int main()
{
    
    std::ifstream ifile("city32.bmp");

    ifile.seekg(0, std::ios::end);
    std::size_t fsize = ifile.tellg();
    std::cout << "fsize=" << fsize << std::endl;

    ifile.seekg(0, std::ios::beg);
    std::vector<unsigned char> buf(fsize, 0);
    std::cout << "vector size: " << buf.size() << std::endl;

    ifile.read((char*)&buf[0], fsize);

    for(int i = 0; i < buf.size(); ++ i)
    {
        std::cout << i << "." << (int)buf.at(i) << "  ";
    }
    std::cout << std::endl;

    std::ofstream ofile("city32_out.bmp");
    ofile.write((char*)&buf[0], fsize);
    ofile.close();

    ifile.close();

    return 0;

}

捕获

原图链接,如有兴趣:https ://allhdwallpapers.com/wp-content/uploads/2015/06/Shanghai-1.jpg

标签: c++

解决方案


确保以二进制模式打开文件。


推荐阅读