Как прочитать файл, используя смещения в c - PullRequest
1 голос
/ 28 ноября 2011

Как я могу прочитать содержимое файла, если мне нужно использовать следующие параметры:

  1. Я должен прочитать файл по частям, используя "начальное значение" части и длинычасти
  2. Начальное значение и длина частей будут считаны из другого файла

В целом, я пытаюсь вычислить значение MD5 для этих частей (вы также можетеназывать их как куски).Начальное значение и длина фрагментов были вычислены и сохранены в файле.Я попытался использовать fread() следующим образом, но это не дает мне логических результатов

char *chunk_buffer;
//chunk_buffer is a pointer to a memory block 
while(cur_poly != NULL) {
    //cur_poly is a structure which is used to store the start and length of chunks
    chunk_buffer = (char*) malloc ((cur_poly->length)*8);
    //here I am trying to allocate memory based on the size of each chunk
    int x=fread (chunk_buffer,1, cur_poly->length, c_file);
    //c_file is the file to be read according to the offsets
    char hash[32];
    hash=md5(chunk_buffer);
    //md5() is a function which can generate the md5 hash values for the chunks
}

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Я вижу две потенциальные проблемы.

  1. Какие единицы измерения представляют cur_poly->length? Вы искажаете память, как если бы это был счет 64-битных слов, но читаете файл, как будто это байты. Если поле представляет длину в байтах, значит, вы читаете правильно, но выделяете слишком много памяти. Однако, если длина поля в 64-битных словах, то вы выделяете правильный объем памяти, а считываете только 1/8 данных.

  2. Код, похоже, игнорирует смещения. (Или при условии, что все куски должны быть смежными). Если вы хотите читать с произвольного смещения, сделайте fseek(fp, offset, SEEK_SET); перед фредом.

Если куски должны быть смежными, на концах все еще может быть заполнение, заставляющее их всех начинать на ровной границе. Вы должны будете искать по заполнению всякий раз, когда число байтов было нечетным (например, .WAV делает это)

1 голос
/ 28 ноября 2011

Я хочу отметить еще несколько проблем с этим кодом.Возможно, вам потребуется добавить более подробную информацию об этих точках.

  1. Если вы хотите читать последовательные фрагменты из вашего файла, вам обычно не нужно изменять указатель get вашего файла.Просто прочитайте кусок, а затем прочитайте следующий.Если вам нужно прочитать фрагменты в случайном порядке, вам нужно использовать fseek .Таким образом вы корректируете начальную позицию следующей файловой операции смещением (от начала или конца файла или относительно текущей позиции).

  2. У вас есть указатель на символchunk_buffer, которую вы, очевидно, используете для временного хранения данных из вашего файла.То есть он действителен только для текущей итерации цикла.Если это так, я бы предложил сделать один раз malloc перед входом в цикл:

    char * chunk_buffer = malloc (MAXIMUM_CHUNK_SIZE);
    

    в цикле, вы можете очистить этот буфер с помощью memset или просто перезаписать данные.Также обратите внимание, что malloc() ed память не инициализируется со значениями '\0' (я не знаю, если это одно предположение, на которое вы полагаетесь ...).

  3. Я неконечно, почему вы фактически выделяете буфер размером length*8 и просто читаете в него length байтов.Вероятно,

    int x = fread (chunk_buffer, SIZE_OF_ITEM, THIS_CHUNK_SIZE, c_file);
    

    будет соответствовать вашим потребностям ближе, если ваши элементы действительно больше байта.

  4. Неясно, что на самом деле делает функция md5(),Какое значение это возвращает?Указатель на буфер, который выделяется динамически?Указатель на локальный массив?В любом случае, вы назначаете возвращаемое значение указателю на локальный массив char с.Возможно, вам не нужно выделять 32 байтов для этого, а просто

    char * hash = md5 (chunk_buffer);
    

    Убедитесь, что вы храните указатель на этот массив где-то, где вы его найдете, когда цикл принимает следующую итерацию.Массив, созданный статически в локальной области действия этой функции, конечно, не может быть передан таким образом.

  5. Ваша md5() функция.Откуда он знает, каков размер куска?Передается указатель, но не размер действительных данных (насколько я вижу).Возможно, вам придется настроить эту функцию так, чтобы она принимала длину входного массива в качестве дополнительного параметра.

  6. Что выдает функция md5(), строка в стиле C (буквенно-цифровые цифры, нольили массив массивов без знака (uint8_t)?

  7. убедитесь, что вы free() выделяете память динамически.Если вы хотите сохранить malloc() внутри цикла, убедитесь, что цикл всегда заканчивается на

    free (chunk_buffer);
    
  8. Чтобы мы могли помочь вам в дальнейшем, вам нужно определить: а) чтоявляются логичными результатами для вас и б) какие результаты вы получаете

...