2

ファイル内のバイト数を単純に出力する必要がある次の基本関数に問題を減らしました。

83886080 バイト (80 MB) のファイルに対して実行すると、正しい番号が出力されます。ただし、4815060992 バイト (4.48 GB) のファイルの場合、520093696 と出力されます。

ポインターを手動で 4815060992 バイトに設定すると (たとえば、正しい位置が返されるため) SEEK_ENDオプションと関係があるよう_fseeki64(fp, (__int64)4815060992, SEEK_SET) _ftelli64です。したがって、回避策はSEEK_ENDを使用せずに適切なファイル サイズを取得することです。これはどのように行われますか?

コードは、MinGW を使用して 32 ビット Windows システムでコンパイルされます (したがって__int64_iseeki64および)。_ftelli64

要するに、ここで何が間違っているのですか?

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().

また、生成されたコードを読んで、stdio ベースのコードが機能しない原因が 64 ビットの混乱であるかどうかを確認することをお勧めします。

于 2010-10-27T14:53:27.470 に答える