在C中将结构写入文件时额外为零

时间:2014-11-23 20:02:09

标签: c file structure fwrite

所以我正在写一个RLE压缩器,基本上,你接受一个文件的运行(相同字节的连续字符串)并将其转换为数据包。例如,如果文件包含: 0xFF 0xFF 0xFF 0xFF 0xBB 0xBB 0xBB你会把它转换成数据包,包含一个长度和数据:它会变成0x04FF 0x03BB。你明白了。

我使用结构来定义数据包。 (byte是无符号8位类型的typedefd类型)

typedef struct      /* Each packet has a length and a data byte */
{
    byte length;    /* how many elements of data there is */
    byte data;      /* whatever byte is being repeated */
} PACKET;

我有我的writeData函数:

void writeData(FILE* f, int offset, PACKET p) 
{
    fseek(f,offset,SEEK_SET); /* move to the offset to write */
    fwrite(&p,sizeof(PACKET),sizeof(PACKET),f); /* write the packet to the given offset */
}

以下是调用函数的代码

    offsetCounter = 0x0;            /* reset offset counter */
    for(i = 0; i < nPackets; i++) /* nPackets is the total amount of packets created */
    {
        writeData(fDest,offsetCounter,packet[i]);
        printf("Wrote %d:0x%X to 0x%X\n",packet[i].length,packet[i].data,offsetCounter);
        offsetCounter += 0x02;      /* skip 2 bytes to write the next packet */
    }

当我运行程序时,一切正常,数据包被正确写入文件,除了某些原因,在文件的最后,有2个0x00字节自动添加。因此,出于某种原因,它只增加了2个空字节。

然而, 当我写这样的writeData函数时:

void writeData(FILE* f, int offset, PACKET p) 
{
    fseek(f,offset,SEEK_SET);
    fwrite(&p.length,sizeof(byte),sizeof(byte),f);
    fwrite(&p.data,sizeof(byte),sizeof(byte),f);
}

,它分别写入结构的每个字节,它不再在文件的末尾添加2个额外的空字节..

我真的很困惑为什么当我编写结构时,它工作正常,但最后增加了2个额外的字节,但是当我单独编写结构的每个元素时,它不会添加它们。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的行号不正确

fwrite(&p,sizeof(PACKET),sizeof(PACKET),f);

结构大小为2,因此您正在编写其中2个,这是您的两个额外字节来自的位置。它应该是

fwrite(&p,sizeof(PACKET),1,f);

额外字节仅出现在文件末尾的原因是因为您使用fseek()来定位文件指针,该指针正确递增2. NB。当您按顺序写入文件时,无论如何都不需要使用fseek()。此外,您使用offsetCounter += 0x02;进行了硬编码,而不是使用offsetCounter += sizeof(PACKET)