我的文件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]);
}
答案 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(你的例子的开头)。这解释了误读。我希望它有所帮助:)