0

次の方法を使用して、このサイズのファイルを取得しようとしています。

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);

読み取りごとに、i16 に等しいかどうかを確認します。これは通常、最後の 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;
}
4

2 に答える 2

1

fstat() を使用して、ファイルのサイズを取得できます。これは、ファイルを読み取ってサイズを計算するよりも優れています。msdn ドキュメントの fstat

編集: Windows での fstat の動作についてはよくわかりません。

于 2012-08-06T08:48:20.537 に答える
0

ファイルをバイナリで ( を使用して) 開くとO_BINARY役立つ場合があります。そうしないと、libne ブレークと EOF 文字で問題が発生する可能性があります。

于 2012-08-06T06:36:54.867 に答える