Чтение файлов в C - PullRequest
       0

Чтение файлов в C

0 голосов
/ 24 октября 2011

Я новичок в C, и проблема, с которой я сталкиваюсь, заключается в том, что у меня есть бинарный файл, который распакован (то есть в определенном формате) ..

То, что я должен сделать, это упаковать его и снова распаковать и посмотреть, соответствует ли оно оригинальной распакованной версии.

Стоит упомянуть одну вещь: мне сказали, что функция упаковки (то есть преобразования в упакованную) и распаковки (то есть преобразования в распакованную) работает хорошо. Просто хочу подтвердить это для себя и немного узнать о C ...

У меня есть два момента, когда я думаю, что делаю ошибку

1: как я читаю файл

2: Я неправильно рассматриваю тип переменной упакованный и распакованный (т. Е. Для упакованного это беззнаковый символ *, а для распакованного - короткий *)

int main(void) {

FILE *fp;

unsigned char* packed ;
short* unpacked;
size_t result;
int fileSize;

fp = fopen(FILENAME, "rb");

fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);

unpacked = (short*) malloc (sizeof(char)*fileSize);

result = fread(unpacked,1,fileSize,fp);

short *originalUnpacked = unpacked;


convert_to_packed(&unpacked, &packed);

convert_to_unpacked(&unpacked, &packed);

if (originalUnpacked == unpacked)
{
    puts ("Thats it !!");

}

fclose(fp );
return EXIT_SUCCESS;
}

Ответы [ 2 ]

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

Этот код очень сломан.

Вы сравниваете указатели (originalUnpacked == unpacked), когда должны сравнивать память. И почему вы смешиваете short * и unsigned char * указатели? Если данные представляют собой двоичный «блоб», вам, вероятно, следует использовать только последний.

Для сравнения памяти используйте стандартную функцию memcmp().

0 голосов
/ 24 октября 2011

Вы должны лучше понять, что такое указатели.Думайте о указателе как о адресе, который вы бы указали на букве, а данные или память - как о доме.Если я сделаю копию адреса, то теперь есть две буквы, но только один дом, обе буквы относятся к одному и тому же дому, и я могу использовать любую, чтобы добраться до дома.Теперь для дублирования дома требуется гораздо больше работы, чем просто копирование адреса на письме.Вам нужен новый дом и новое письмо с новым адресом.

unpacked = (short*) malloc (sizeof(char)*fileSize);
  ^^                  ^^
the letter          building the house


short *originalUnpacked = unpacked;
         ^^                  ^^
       new letter         old letter = copying the letter (address) not the house!


if (originalUnpacked == unpacked)
        ^^                 ^^
    new letter          old letter - neither changed so are equal (same address)

Вы дали этот адрес функциям преобразования convert_to_packed и convert_to_unpacked, которые затем переписали исходные данные, потому что вы забыли построитьновый дом для хранения исходных данных.

Чтобы исправить код, вам нужно построить новый дом и использовать его для хранения результатов упаковки и распаковки.Затем вам нужно сравнить содержимое двух домов, а не буквы, которые их адресуют.

 short newUnpacked = (short*) malloc (sizeof(char)*fileSize);

 convert_to_packed(&unpacked, &packed);
 convert_to_unpacked(&unpacked, &newUnpacked); // put unpacked data into new house!

 if (memcmp (unpacked, newUnpacked, filesize) == 0) // comparing contents of houses!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...