如何正确使用fread()读取指定长度的内容(C语言)

时间:2014-04-15 21:40:32

标签: c serialization fwrite fread

我使用fwrite()函数将4个数据块写入名为" example2.bin"的文件中。在文件的最开头,我还写了块数(此追逐中为4)。每个块包含以下格式的数据:0(偏移),4(字符串的大小)和字符串" dang"。

我首先将内存地址复制到char * buffer,其中包含块数,以及4个数据块,如上所述。然后我做了以下事情:

filePtr = fopen("example2.bin", "wb+");
fwrite(buffer, contentSize, 1, filePtr); /*contentSize is the sum of the 4 blocks in byte */

fwrite()运行良好,我能够看到文件example2.bin中保存的字符串。但是,我在解析文件example2.bin时遇到问题:

int main()
{

    FILE *filePtr;
    int listLength = 0;
    int num_elements = 0;
    int position = 0;
    int offset = 0;
    int size = 0;
    char *data;

    listLength = fileSize("example2.bin");  /* get the file size in byte */
    filePtr = fopen("example2.bin", "rb");

    fread(&num_elements, 1, 1, filePtr);   /* get the number of blocks saved in this file */
    printf("num_elements value is %d \n", num_elements);
    position += sizeof(num_elements);     /* track the position where the fread() is at */
    printf("before the for-loop, position is %d \n", position);

    int index;
    for (index = 0; index < num_elements; index++)
    {
        fread(&offset, position, 1, filePtr);
        position += sizeof(offset);
        printf("offset is %d and position is %d \n", offset, position);

        fread(&size, position, 1, filePtr);
        position += sizeof(size);
        printf("size is %d and position is %d \n", size, position);

        fread(data, position, 1, filePtr);
        position += size;
        printf("size is %d and data is %s \n", size, data);
    }
    return 0;
}

当我运行已编译的程序时,我得到了以下输出,这对我来说很奇怪:

  

num_elements值为4
  在for-loop之前,位置是4
  偏移量为0,位置为8
  尺寸为67108864,位置为1996488708   分段错误(核心转储)

我不明白为什么尺寸和位置增加到如此大的数字。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我想我已经找到了分段错误错误的原因:我没有为指针分配内存data

在执行malloc之后,分段错误错误消失了:data = malloc(size);此行之前fread(data, size, 1, filePtr);

在for循环结束时,我还需要释放分配的内存:free(data);