Несколько баллов за ваше рассмотрение:
1. Тип возврата ftell
long int
, поэтому лучше объявить fileSize
как long int
( как sizeof (int) <= sizeof (long) </a>).
2. В C лучше не указывать возвращаемое значение malloc
.Также вы, вероятно, можете избавиться от sizeof(char)
при использовании в malloc
.
3. fread
продвигает файловый поток, таким образом, после первого вызова fread
указатель файлового потока переместился наразмер файла в соответствии с fileSize
.Таким образом, второй fread
сразу после этого не сможет ничего прочитать (при условии, что первый преуспел). По этой причине вы видите поведение, упомянутое в вашей программе .Вам необходимо сбросить указатель потока файла, используя rewind
перед вторым вызовом fread
.Также вы можете проверить возвращаемое значение fread
, которое является количеством успешно прочитанных байтов, чтобы проверить, сколько байтов действительно было прочитано успешно.Попробуйте что-нибудь по этим строкам:
size_t bytes_read;
bytes_read = fread(unPacked, 1, fileSize, fp);
/* some check or print of bytes read successfully if needed */
/* Reset fp if fread was successfully to load file in memory pointed by originalUnPacked */
rewind(fp);
bytes_read = fread(originalUnPacked, 1, fileSize, fp);
/* some check or print of bytes read successfully if needed */
/* memcmp etc */
4.Это может быть хорошей идеей для проверки возвращаемых значений fopen
, malloc
и т. Д. Против сбоя, т.е. проверка NULL
в случае fopen
& malloc
.
Надеюсь, это поможет!