fread大きなファイルの読み取りと戻り値の問題

1847 ワード

今日freadファイルの読み取りに問題が発生しました.もともと小さな問題でしたが、気づかずにデバッグに時間がかかったので、メモしておきます.
size_t fread ( 
    void * ptr, 
    size_t size, 
    size_t count, 
    FILE * stream 
);
//Parameters
/*
ptr
Pointer to a block of memory with a minimum size of (size*count) bytes.
size
Size in bytes of each element to be read.
count
Number of elements, each one with a size of size bytes.
stream
Pointer to a FILE object that specifies an input stream.
*/

Return Value
The total number of elements successfully read is returned as a  size_t
 object, which is an integral data type.
If this number differs from the 
count
 parameter, either an error occured or the End Of File was reached.
You can use either  ferror
 or  feof
 to check whether an error happened or the End-of-File was reached.
まず関数定義をコピーします.ここでまず注意しなければならないのは関数が値を返すことです.関数は読み出した要素の個数を返します.注意してください.読み出したバイト数とは限りません.次のコードの場合にのみ返されるバイト数です.
fread(ptr, 1, count, fp);

私が今日freadでファイルを読むときに出会った問題は、1 M程度のファイルを読むことで、いつも前の部分だけを読むことです.例えば、
numOfItem = fread(fontDotData, 1, allFontSize, fp);
上のコードはファイルを読み、allFontSizeの値は3657728で、戻り値numOfItemは10169です.
理論上numOfItemはallFontSizeと等しいはずですが、問題はどこにあるのでしょうか.
次のファイルが開くのを見てみましょう.
FILE *fp = fopen(fontFilename, "r");

問題がわかるか?
    : 
              
 
  
           ,                      EOF,       (     ,      0x00 0x00 0xff 0xff,            ,          ,     ) 
FILE *fp = fopen(fontFilename, "rb");