Тот же файл, тот же размер файла, но сравнение памяти возвращает ненулевое значение - PullRequest
0 голосов
/ 25 октября 2011
#define "/local/home/..."

FILE *fp;

short *originalUnPacked;
short *unPacked;

int fileSize;

fp = fopen(FILENAME, "r");
fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);

originalUnPacked = (short*) malloc (sizeof(char)*fileSize);
unPacked = (short*) malloc (sizeof(char)*fileSize);

fread(unPacked, 1, fileSize, fp);
fread(originalUnPacked, 1, fileSize, fp);    

if( memcmp( unPacked, originalUnPacked, fileSize) == 0) 
{
 print (" unpacked and original unpacked equal ") // Not happens
}

Мое небольшое знание C говорит, что оператор print в последнем блоке if должен быть напечатан, но это не так, есть идеи Почему ??

Просто чтобы добавить больше ясности и показать вам полный кодя добавил оператор определения и два оператора fread перед блоком if.

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Несколько баллов за ваше рассмотрение:
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.
Надеюсь, это поможет!

1 голос
/ 25 октября 2011

Память, выделенная с помощью malloc, не инициализируется заранее, поэтому ее содержимое является случайным и, следовательно, почти наверняка разным для двух распределений.

Ожидаемое (вероятностно говоря, "определенный ") результат - именно то, что происходит.

Вы имели в виду загрузить файл в оба этих буфера перед тестированием с memcmp, но забыли это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...