需要有关 C 语言中文件 IO 的帮助

本文关键字:文件 IO 帮助 中文 语言 | 更新日期: 2023-09-27 17:58:17

我正在将以下代码从 C# 转换为 C,我认为我这样做不正确。

Entry3Dentry_3d 只是在这两种情况下都包含int lookup, length, extra的结构。这是 C# 代码段(它工作得很好(:

    BinaryReader reader = new BinaryReader(File.Open("artidx.mul", FileMode.Open));
    BinaryReader art = new BinaryReader(File.Open("art.mul", FileMode.Open));
    int count = (int)(reader.BaseStream.Length / 12);
    int length = 0x10000;
    Entry3D[] index = new Entry3D[length];
    Console.WriteLine("Loading indexes {0}", count);
    for (int i = 0; i < count && i < length; i++)
    {
        index[i].lookup = reader.ReadInt32();
        index[i].length = reader.ReadInt32();
        index[i].extra = reader.ReadInt32();
    }
    for (int i = count; i < length; ++i)
    {
        index[i].lookup = -1; 
        index[i].length = -1;
        index[i].extra = -1;
    }

这是我在 C 中遇到问题的部分。

/* Init everything else */
printf( "Init maps & gfx" );
mapFile = fopen( "sd:/map0.mul",   "rb" ), 
 artIdx = fopen( "sd:/artidx.mul", "rb" ),
    art = fopen( "sd:/art.mul",    "rb" );
if ( mapFile == NULL || artIdx == NULL || art == NULL )
{
  printf( "D'oh, file loading failed: [%d][%d][%d]", mapFile == NULL, artIdx == NULL, art == NULL  );
  return(1);
}
/* Find artidx count and set length */
printf( "Init art index" );
fseek( artIdx, 0, SEEK_END ); 
int count = (ftell(artIdx) / 12), length = 0x10000; // 0x10000 entries availible
entry_3d entries[length];
fseek( artIdx, 0, SEEK_SET );
printf( "Reading art-idx, count=%d", count );
int i;
for( i = 0; i < count && i < length; i++ )
{
  //printf( "loc: %u i: %u", ftell( artIdx ), i );
  //fread( &entries[i], 12, 1, artIdx );
  fread( &(entries[i].lookup), 4, 1, artIdx ); // read 12 bytes total
  fread( &(entries[i].length), 4, 1, artIdx );
  fread( &(entries[i].extra), 4, 1, artIdx );
}
printf( "Setting aidx remainders" );
for ( i = count; i < length; i++ )
{
  entries[i].lookup = -1; 
  entries[i].length = -1;
  entries[i].extra = -1;
}  

对我来说,调试 C 部分有点不可能,但我可以说它在第一个 for 循环的某个地方"死亡"。我猜它可能正在阅读流的末尾(即使它不应该(?

需要有关 C 语言中文件 IO 的帮助

我在这里没有看到太多错误。该代码将在 linux/windows box 上正常工作。

错误处理可以改进。

当 artidx 文件不是 12 字节的倍数时,它不会正常失败。

我想这段代码很容易耗尽Wii控制台上的内存。尝试动态分配entry_3d数组(使用 calloc/malloc(。此外,请尝试减小长度以查看内存是否不足。Wii 上的 libc 实现在堆栈重叠堆时不会警告您并非不可能;嵌入式系统有时假设程序员知道设备的所有复杂性和局限性(Wii及其许多处理芯片在许多方面都是一个很好的例子,所以我真的会考虑这一点(。

我很确定您知道如何找到自制开发人员潜伏的论坛。他们也许能够在这里提供一些启示。

如果您无权访问调试器,则可以在循环中添加一些printf语句,以查看它在死亡之前走了多远。 在每个循环迭代的顶部添加类似printf("i == %i'n", i);的内容。 此外,将 fread 的返回值保存到变量中并将其打印出来(对于每个fread调用(。 当程序死了,这至少应该留下一串面包屑,你可以跟随。

此外,请检查fopenfseek调用的返回值,并确保它们成功返回。