如何使用c中的偏移读取文件

时间:2011-11-28 14:22:28

标签: c structure offset fread

如果必须使用以下参数,我该如何阅读文件的内容:

  1. 我必须使用部件的“起始值”和部件长度来阅读部分文件
  2. 将从另一个文件中读取部件的起始值和长度
  3. 总的来说,我正在尝试计算这些部分的MD5值(您也可以将它们称为CHUNKS)。 已经计算了块的起始值和长度并将其存储在文件中。 我尝试使用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 个答案:

答案 0 :(得分:3)

我看到两个潜在的问题。

  1. cur_poly->length代表哪些单位?你正在将内存看作是一个64位字的计数,但是读取文件就好像它是字节一样。如果字段表示以字节为单位的长度,那么您正在正确读取,但分配的内存太多。但是,如果字段的长度为64位字,那么您将分配适当的内存量,但只读取数据的1/8。

  2. 代码似乎忽略了偏移量。 (或假设所有块必须是连续的)。如果你想从任意偏移读取,请在fread之前做fseek(fp, offset, SEEK_SET);

  3. 如果块应该是连续的,那么端部仍然可能存在填充以迫使它们全部在偶数边界上开始。每当字节数为奇数时,你就必须寻找填充(.WAV这样做,作为一个例子)

答案 1 :(得分:1)

我想要注意该代码的一些问题。您可能需要在这些点上添加更多详细信息。

  1. 如果要从文件中读取连续的块,通常不需要修改文件的获取指针。只需阅读一个块,然后阅读下一个。如果您需要以随机顺序读取块,则需要使用fseek。这样,您可以通过偏移量(从文件的开头或结尾或相对于当前位置)调整下一个文件操作的开始位置。

  2. 您有一个字符chunk_buffer,您显然可以暂时存储文件中的数据。也就是说,它仅对当前循环迭代有效。 如果是这种情况,我建议您在进入循环之前执行malloc一次:

    char * chunk_buffer = malloc (MAXIMUM_CHUNK_SIZE);
    

    在循环中,您可以使用memset清除此缓冲区,或者只是覆盖数据。另请注意,malloc()内存未使用'\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风格的字符串(字母数字,以null结尾)或字节大小的无符号整数数组(uint8_t)?

  7. 确保您free()动态分配的内存。如果要将malloc()保留在循环内,请确保循环始终以

    结尾
    free (chunk_buffer);
    
  8. 为了让我们为您提供进一步的帮助,您需要定义 a)你和你的逻辑结果是什么 b)你得到了什么结果