gpt4 book ai didi

c - 在 C 中将结构写入文件时的额外零

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:25 24 4
gpt4 key购买 nike

所以我正在编写一个 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 个额外的字节,但是当我分别编写结构的每个元素时,它没有添加它们。

谁能帮我解决这个问题?

最佳答案

你的线路不正确

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

结构大小是 2,所以你写了其中的 2 个,这就是你的两个额外字节的来源。应该是

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

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

关于c - 在 C 中将结构写入文件时的额外零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27093647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com