在C中读取二进制文件

时间:2016-07-26 10:06:09

标签: c binaryfiles

我的文件test.bin有内容:33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31 当我读到这个文件时,我得到了这样的结果:3333203046203133203035203534203635。我无法理解我做错了什么。

void ReadBinFile()
{
    int i;
    FILE *ptr;
    unsigned char buffer2[17];
    ptr = fopen("test.bin","r");
    fread(buffer2,sizeof(buffer2),1,ptr);

    for(i = 0; i<17; i++)
        printf("%x", buffer2[i]);
}

2 个答案:

答案 0 :(得分:9)

你得到了正确的答案。 您已写入文件“33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31” 并且您收到的回复“3333203046203133203035203534203635”恰好是您编写的数据的十六进制ASCII。

您需要将数据写为二进制文件作为二进制文件,这将解决您的问题。

**编辑,因为这个评论太大了**

当您想使用二进制文件时,您需要以二进制文件的形式打开文件,将文件写为二进制文件,从文件中读取二进制文件等.fprintf()不适用于二进制文件。所以为了让你的代码工作,你需要做出这些改变:(这是你的代码的快速破解,它需要大量的抛光)

void WriteBinFile(void)
{
    FILE *ptr; 
    unsigned char a[] = {0xFF}; 
    ptr = fopen("test.bin","wb"); 
    fwrite (a, sizeof(unsigned char), 1, ptr);
    fclose (ptr);
}

void ReadBinFile(void)
{
    static const size_t BufferSize = 17;
    int i;
    FILE *ptr;
    unsigned char buffer2[BufferSize];

    ptr = fopen("test.bin","rb");
    const size_t fileSize = fread(buffer2, sizeof(unsigned char), BufferSize, ptr);

    printf("File size = %d bytes\n", fileSize);
    printf("Size of each item in bytes = %d\n", sizeof(unsigned char));

    for(i = 0; i < (fileSize / sizeof(unsigned char)); i++)
    {
        printf("0x%x ", (int)buffer2[i]);
    }
    fclose (ptr);
}

int main (void)
{
    WriteBinFile();
    ReadBinFile();
    printf("\nPress enter to exit\n");
    return fgetc(stdin);
}

Write函数使用fwrite()从数据数组(包含一个元素)将字符写入文件,然后关闭文件。 读取功能与以前相同,但我添加了一些诊断功能,因此您可以检查文件和字符大小。它还只显示它已读取的数据,而不是缓冲区中的初始化内存。

此外,您必须关闭文件,否则在程序退出之前无法重新打开文件。

任何问题,只是喊道。

答案 1 :(得分:1)

您似乎正在将文件作为字符串而不是HEX读取。例如:&#34; 3&#34;字符串是0x33和&#34; &#34;因为字符串是0x20。那么&#34; 33&#34;是0x333320(你的例子的开头)。这解释了误读。我希望它有所帮助:)