2

我已将问题简化为以下基本功能,该功能应仅打印文件中的字节数。

当我为 83886080 字节(80 MB)的文件执行它时,它会打印正确的数字。但是,对于 4815060992 字节(4.48 GB)的文件,它会打印 520093696,这太低了。

它似乎与SEEK_END选项有关,因为如果我手动将指针设置为 4815060992 字节(例如_fseeki64(fp, (__int64)4815060992, SEEK_SET) _ftelli64返回正确的位置。所以解决方法是在不使用SEEK_END的情况下获得正确的文件大小,这是如何完成的?

该代码是在 32 位 Windows 系统(因此__int64_iseeki64_ftelli64)上使用 MinGW 编译的。

简而言之:我在这里做错了什么?

void printbytes(char* filename)
{
  FILE *fp;
  __int64 n;
  int result;

  /* Open file */
  fp = fopen(filename, "rb");
  if (fp == NULL)
  {
    perror("Error: could not open file!\n");
    return -1;
  }

  /* Find end of file */
  result = _fseeki64(fp, (__int64)0, SEEK_END);
  if (result)
  {
    perror("Error: fseek failed!\n");
    return result;
  }

  /* Get number of bytes */
  n = _ftelli64(fp);

  printf("%I64d\n", n);

  /* Close file */
  fclose(fp);
}
4

2 回答 2

2

很抱歉没有早点发布,但我已经有一段时间专注于其他项目了。以下解决方案有效:

__int64 nsamples(char* filename)
{
  int fh;
  __int64 n;

  /* Open file */
  fh = _open( filename, _O_BINARY );

  /* Find end of file */
  n = _lseeki64(fh, 0, SEEK_END);

  /* Close file */
  _close(fh);

 return n / sizeof(short);
}

诀窍是使用_open而不是fopen打开文件。我仍然不明白为什么必须这样做,但至少现在可行。感谢大家的建议,最终为我指明了正确的方向。(这是相关问题编号 4003405 的答案的副本)。

于 2011-02-15T13:50:16.717 回答
1

在 Windows 中,您应该能够“原生化”并且只需使用GetFileSizeEx().

我还建议您阅读生成的代码,看看它是否可能是一些 64 位混淆,这会阻止您的基于 stdio 的代码工作。

于 2010-10-27T14:53:27.470 回答