加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

32位Windows和2GB文件大小限制(C与fseek和ftell)

发布时间:2020-12-13 20:35:09 所属栏目:Windows 来源:网络整理
导读:我试图将一个小型数据分析程序从64位UNIX移植到32位Windows XP系统(不要问:)). 但是现在我遇到了2GB文件大小限制的问题(在这个平台上长时间不是64位). 我搜索了这个网站和其他人可能的解决方案,但找不到任何可以直接翻译我的问题. 问题在于使用fseek和ftell.
我试图将一个小型数据分析程序从64位UNIX移植到32位Windows XP系统(不要问:)).
但是现在我遇到了2GB文件大小限制的问题(在这个平台上长时间不是64位).

我搜索了这个网站和其他人可能的解决方案,但找不到任何可以直接翻译我的问题.
问题在于使用fseek和ftell.

有没有人知道对以下两个函数的修改,使它们可以在32位Windows XP上运行大于2GB的文件(实际上订购100GB).

至关重要的是,nsamples的返回类型是64位整数(可能是int64_t).

long nsamples(char* filename)
{
  FILE *fp;
  long n;

  /* Open file */
  fp = fopen(filename,"rb");

  /* Find end of file */
  fseek(fp,0L,SEEK_END);

  /* Get number of samples */
  n = ftell(fp) / sizeof(short);

  /* Close file */
  fclose(fp);

  /* Return number of samples in file */
  return n;
}

void readdata(char* filename,short* data,long start,int n)
{
  FILE *fp;

  /* Open file */
  fp = fopen(filename,"rb");

  /* Skip to correct position */
  fseek(fp,start * sizeof(short),SEEK_SET);

  /* Read data */
  fread(data,sizeof(short),n,fp);

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

我尝试使用_fseeki64和_ftelli64使用以下代码替换nsamples:

__int64 nsamples(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 samples */
  n = _ftelli64(fp) / sizeof(short);

  printf("%I64dn",n);

  /* Close file */
  fclose(fp);

  /* Return number of samples in file */
  return n;
}

对于4815060992字节的文件,我得到260046848个样本(例如_ftelli64给出520093696字节),这很奇怪.

奇怪的是,当我在_fseeki64的调用中省略(__int64)强制转换时,我得到一个运行时错误(无效的参数).

有任何想法吗?

有两个名为_fseeki64和_ftelli64的函数,即使在32位Windows上也支持更长的文件偏移量:
int _fseeki64(FILE *stream,__int64 offset,int origin);

__int64 _ftelli64(FILE *stream);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读