0

我实际上想做的是创建一个二维数组,但它是在文件中而不是在主内存中。

为了跳过这个文件,我使用 fseek 然后 fread 将我需要的内容返回到我正在使用的结构中,问题是当我从结构中的文件中读取时,loadTile()结构gameTile8File gtf中充满了看似垃圾数据的内容。

请注意,在写入和读取之间,文件永远不会关闭或刷新,不要认为这应该有所作为。该文件是二进制文件,并且总是使用 options 打开"r+b"

我正在检查 上的返回值fseek()fread()并且fwrite()所有人都说没有问题。

void saveTile(gameTile8& gt, unsigned int x, unsigned int y, bool newFile)
{
    //the given coordinates are in world space
    //first load the old coordinates (needed so that correct movements in file 2 are made)
    if(fseek(file1, (y * worldTileKey::gameWorldSizeX*worldTile::worldTileCountX) + x, SEEK_SET))
    {
        cout << "fseek failed! 01\n";
    }
    gameTile8File gtf;
    fread(&gtf, sizeof(gameTile8File), 1, file1);

    //convert a gameTile8 to a gameTile8File
    gtf.save(gt, file2, newFile);

    //once all movements are done then save the tile
    if(fseek(file1, (y * worldTileKey::gameWorldSizeX*worldTile::worldTileCountX) + x, SEEK_SET))
    {
        cout << "fseek failed! 01\n";
    }
    if(fwrite(&gtf, sizeof(gameTile8File), 1, file1) != 1)
    {
        cout << "fwrite failed! 01\n";
    }
}

void loadTile(gameTile8& gt, unsigned int x, unsigned int y)
{
    //the given coordinates are in world space
    //seek to the given spot load it
    if(fseek(file1, (y * worldTileKey::gameWorldSizeX*worldTile::worldTileCountX) + x, SEEK_SET))
    {
        cout << "fseek failed! 01\n";
    }

    gameTile8File gtf;
    //read in the tile
    if(fread(&gtf, sizeof(gameTile8File), 1, file1) != 1)
    {
        cout << "read failed! 01\n";
    }
    //then load it
    gtf.load(gt, file1, file2);
}
4

1 回答 1

1

我认为您的问题是以fseek()字节为单位的偏移量。您需要将偏移量乘以sizeof(gameTile8File)

fseek(file1, sizeof(gameTile8File)*(y * worldTileKey::gameWorldSizeX*worldTile::worldTileCountX + x), SEEK_SET))

我不清楚你使用worldTileKey::gameWorldSizeX*worldTile::worldTileCountX. 您存储在文件worldTileKey::gameWorldSizeX*worldTile::worldTileCountX磁贴中的网格是否宽?

于 2012-08-08T17:47:18.737 回答