提问者:小点点

将std::ofstream转换为二进制文件的C++意外结果


现在我正在创建数据,但我得到了一个意想不到的结果。

这是我写的代码。

float f = 1.7005484e-09;
uchar b[4];
memcpy(&b, (unsigned char *)&f, 4);
std::ofstream fout("abc.bin", std::ios::out | std::ios::binary);
fout.write((const char *)&b, sizeof(float));
fout.close();
printf("%x%x %x%x\n", b[0],b[1],b[2],b[3]);

该文件的预期结果是“BAB8 E930”,但我得到的结果是“0”。

当我将fout.write((const char*)&b,sizeof(float));替换为

fout.write((const char *)&b, sizeof(float)+1);

我得到的是'BAB8E93000'。

这里的问题是什么,如何解决这个问题??


共1个答案

匿名用户

您的代码中有几个未定义的行为。

uchar b[4];

假设对于编译器,float的大小为4,请执行以下操作

uchar b[sizeof(float)];
memcpy(&b, (unsigned char *)&f, 4);

首先,您需要memcpy(b,...,其次,您假设float的大小是4,第三,您依赖于endianess

fout.write((const char *)&b, sizeof(float));

首先您需要fout.write((const char*)b,...,然后您假设b的大小是sizeof(float)

printf("%x%x %x%x\n", b[0],b[1],b[2],b[3]);

假设b由memcpy完全设置,因此对于编译器,float的大小至少为4

该文件的预期结果是“BAB8 E930”,但我得到的结果是“0”。

您可能会谈论生成的文件的内容(例如使用cat),在前面的注释中,预期的结果可以是:0,而不是“BAB8 E930”,当然是printf(“%x%x%x%x\n”,b[0],b[1],b[2],b[3])产生的输出;

您会混淆打印字符和以六元格式打印其代码,例如printf("%c“,'0')(或putchar('0'))生成0,但如果您的编译器使用ASCII代码,则printf("%x”,'0')生成30

 fout.write((const char *)&b, sizeof(float)+1);

如果浮点数的大小为4,这意味着您在b之后写入了一个字符,这也是一个未定义的行为

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(std|ofstream|转|换为|二进制|文件|c++|意外)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?