【问题标题】:Extra zeroes when writing structure to file in C在 C 中将结构写入文件时出现额外的零
【发布时间】:2014-11-23 20:02:09
【问题描述】:

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

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

【问题讨论】:

  • 你在什么硬件上?更具体地说,硬件和编译器的对齐/填充要求是什么?
  • 在任何地方插入printf("%d\n", (int)sizeof(PACKET));,结果可能会让您大吃一惊。
  • @Jongware,打印size_t 的正确方法是%zu(注意:windows 卡在 C89,所以这不会在那里工作)。

标签: c file structure fwrite


【解决方案1】:

你的行不正确

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

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

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

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

【讨论】:

  • 感谢您指出这一点。我刚刚意识到,当它说“元素的数量,每个元素的大小为 size 字节”时,我误解了参考页面。无论出于何种原因,我认为我必须输入 (size * amount) 才能写入。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多