Наконец-то выяснил в чем проблема!) Конечно же не без вашей помощи, всем спасибо, особенно Michelnok и vic!!!Рассказываю в чем проблема:
>Если это действительно сразу после fread (т.е. ты совсем ничего не делаешь
>с result), то похоже таки на ошибку в libc. Точнее, в
>твоей ее версии.
После этого поста, я решил проверить, что же на самом деле делает fread.
Открыл /usr/src/lib/libc/stdio/fread.c и что я вижу
.........
size_t
fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
{
int ret; //ВНИМАНИЕ СЮДА
FLOCKFILE(fp);
ret = __fread(buf, size, count, fp);
FUNLOCKFILE(fp);
return (ret); //ВНИМАНИЕ СЮДА
}
size_t
__fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
{
size_t resid;
char *p;
int r; //ВНИМАНИЕ СЮДА
size_t total;
/*
* The ANSI standard requires a return value of 0 for a count
* or a size of 0. Peculiarily, it imposes no such requirements
* on fwrite; it only requires fread to be broken.
*/
if ((resid = count * size) == 0)
.........
while (resid > (r = fp->_r)) {
(void)memcpy((void *)p, (void *)fp->_p, (size_t)r);
fp->_p += r;
/* fp->_r = 0 ... done in __srefill */
p += r;
resid -= r; //ВНИМАНИЕ СЮДА
if (__srefill(fp)) {
/* no more input: return partial result */
return ((total - resid) / size);
}
}
.........
return (count);
}
-----------------------
что функция возвращает переменную типа int, ХОТЯ в функции объявленно, что возвращаем тип size_t, отсюда понятно почему файлы больше 2гиг, а это больше 2 147 483 648, возвращал что-то страшное.
После исправления int на size_t, все заработало.
Често говоря, я удивлен, что разработчики freebsd допустили такую ошибку(size_t -> int).