文件在linux中阅读方式不同?C++

sud*_*ssy 2 c++ linux mingw32

我是一个相当新的程序员,但我认为我的google-fu非常称职,我花了几个小时搜索.

我有一个简单的SDL应用程序从二进制文件读取(2个字节作为幻数,然后每个"tile"5个字节)然后它显示缓冲区中的每个tile,字节决定x,y,id,可通过性等等.所以它真的只是水平加载.

它可以在任何Windows计算机上运行(经过测试的Windows Server,7/64和7/32),但是当我在linux上编译它时,它会随机显示随机位置.我很想说它是从RAM中的错误部分读取的,但我对幻数​​进行了诠释,因此如果前两个字节都没有,它会返回一个错误.

我很想自己解决这个问题,但现在它让我陷入困境,除非我能在移动中编程(我的笔记本电脑运行linux),否则我无法进一步发展.我在linux上使用G ++,在windows上使用mingw32g ++.

bool loadlevel(int level_number)
{
    int length;
    std::string filename;
    filename = "Levels/level";
    filename += level_number+48;
    filename += ".lvl";
    std::ifstream level;
    level.open(filename.c_str(),std::ios::in|std::ios::binary);
    level.seekg(0,std::ios::end);
    length = level.tellg();
    level.seekg(0,std::ios::beg);
    char buffer[length];
    level.read(buffer,length);
    if (buffer[0] == 0x49 && buffer[1] == 0x14)
    {
        char tile_buffer[BYTES_PER_TILE];
        int buffer_place = 1;
        while(buffer_place < length)
        {
            for (int i = 1;i <= BYTES_PER_TILE;i++)
            {
                tile_buffer[i] = buffer[buffer_place+1];
                buffer_place++;
            }
            apply_surface(tile_buffer[1],tile_buffer[2],tiles,screen,&clip[tile_buffer[3]]);
        }
    }
    else
    {
        // File is invalid
        return false;
    }
    level.close();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

小智 5

您的阵列处理不正确.
C/C++中的数组索引从0开始.

您已将'tile_buffer'定义为大小为'BYTES_PER_TILE'的数组.
如果BYTES_PER_TILE是5,那么你的数组将把tile_buffer [0]元素添加到tile_buffer [4].

在你的内部for循环中,你从1循环到5,这样就会发生缓冲区溢出.

我不知道这是否是你问题的原因,但肯定无济于事.