次の方法を使用して、このサイズのファイルを取得しようとしています。
size_t fsize = 0;
fseek(fin, 0L, SEEK_END);
fsize = ftell(fin);
fseek(fin, 0L, SEEK_SET);
問題のファイルは 2GiB を少し超えており、ftell は巨大な数値を返します。
私のアプリケーションでは、読み取りごとにシーク ポインターを数バイト戻す必要もあります。以下を使用しました。
i = fread(inbuf, 1,readSize, fin);
fseek(fin, -16, SEEK_CUR);
読み取りごとに、i
16 に等しいかどうかを確認します。これは通常、最後の fread の後にファイルの最後に到達した場合に発生するはずです。ただし、これも機能せず、ゼロの値が に割り当てられi
、シーク ポインターが戻されなかったことを示します。
私のプログラムは Linux で問題なく動作し、さまざまな読み取りサイズとファイル サイズでテストされていることに注意してください。このコードは、Linux バージョンのコードとほぼ同じです。stdint
違いは、Windows で C99のライブラリを使用できなかったことです。それ以外は、コードはまったく同じです。Linux バージョンは、まったく同じテスト ファイルと読み取りサイズを使用して正常に動作します。
最後に、これは Win7 で VS2010 を使用する CUDA プログラム (ランタイム バージョン 4.2) であることを述べておく必要があります。これは 64 ビット プログラムです。
編集
このファイルは 'b' フラグで開かれました。コードは次のとおりです。
if(!(fin = fopen(argv[1], "rb")))
{
printf("The input file: %s could not be opened\n", argv[1]);
err = -5; goto exit;
}
if(!(fout = fopen(argv[2], "wb")))
{
printf("The output file: %s could not be opened\n", argv[1]);
err = -6; goto exit;
}