ファイル内のバイト数を単純に出力する必要がある次の基本関数に問題を減らしました。
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);
}