为什么我的流式写作会导致比预期更多的字节

Why does my ofstream write result in more bytes than expected?

本文关键字:字节 我的 为什么      更新时间:2023-10-16

编辑1:我已经确定了触发此问题但仍无法修复的十六进制组合。请参阅底部的编辑:

原始帖子:我正在尝试将数据从传感器传递到二进制文件。我正在使用制造商的示例代码和DLL一次抓取4096字节,然后我尝试将其写入文件。我的最终文件大小在4100和4114字节之间变化,额外的位在整个文件中随机分布。

传感器的数据最终以未签名的char 4096长。当我将每个char发送到std :: cout时值正确(因此传感器和与之通信的DLL正在起作用(。但是,将整个字符写入二进制文件(使用ofstream ::写(会像一次写每个字符一样(使用ofstream :: put(失败。在下面的代码中,我删除了对文件创建的错误检查等。

unsigned int uiread = 4096;
unsigned char ccdbuf[4096];
ofstream ofile;
/* DLL call stuff removed since it's hardware-specific */
ofile.open("camdata.bin");
// ofile.write(reinterpret_cast<const char*>(ccdbuf), uiread); // 4100 - 4114
for (int ii = 0; ii < uiread; ii++)
{
    std::cout << (int)ccdbuf[ii] << "n";
    ofile.put(ccdbuf[ii]);                  // 4100 - 4114
    // ofile.put(5);                        // 4096
}
ofile.close();

传感器制造商向我提供了评论的" ofile.write"系列。最后的评论重点是,结果的文件长度从4100到4114字节不等,整个文件中都散布了额外的位。

for循环中的'std :: cout'行显示了正确的值。

如果我编写" 5'4096次",则文件正是我所期望的(4096字节(。但是,一次编写Char Vector一个元素会导致可变的二进制记录长度(超过4096(,随机位置用于额外的位置。

我怀疑我的问题是从无符号字符转换为ofstream :: write(const char?(的预期类型,但我只是不知道如何处理它。预先感谢。

编辑1:我已经确定,最初触发此行为的两个字节字符串始终以0x0a结束,但是第一个不正确的编写数据实际上是对俩的第一个字节。因此,发送给STD的文本输出的十六进制等效物可能是0x890a,0xc00a或0xc20a,但是当输出断开时,该字节对始终写为0x0A0D。

查看构成第一个字节的位似乎并没有显示出在0x0a之前的位模式,而不是每一个以0x0a结尾的两字节对触发错误。由于ofStream :: put在一个for循环中,这对我来说似乎很奇怪,第一个写作错误将是值0x0a的字节之前的循环。

正如对问题的注释中指出的那样,没有明确打开写文件,因为二进制窗口有时会修改写入。修改Ofstream :: Open命令以包含二进制标志已解决了问题。

ofile.open("camdata.bin", ios_base::binary);

更换

ofile.open("camdata.bin");
相关文章: