为什么我的ofstream写操作导致比预期更多的字节?

时间:2019-05-08 02:23:08

标签: c++ ofstream unsigned-char

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

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

来自传感器的数据最终以无符号char 4096结尾。当我将每个char发送到std :: cout时,值是正确的(因此传感器和与其通信的DLL都在工作)。但是,将整个字符写入二进制文件(使用ofstream :: write)失败,一次写入每个字符(使用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”行向我显示了正确的值。

如果我写4096次“ 5”,则该文件正是我期望的(4096字节)。但是一次将char向量写入一个元素会导致二进制记录长度可变(大于4096),并且多余位的位置随机。

我怀疑我的问题出在无符号字符到ofstream :: write(常量字符?)的预期类型的​​转换上,但是我只是不知道如何解决。预先感谢。

编辑1: 我已经确定,最初触发此行为的两字节字符串始终以0x0A结尾,但第一个不正确写入的数据实际上是该对中的第一个字节。因此,发送到std:cout的文本输出的十六进制等效项可能是0x890A,0xC00A或0xC20A,但是当输出中断时,该字节对始终写为0x0A0D。

查看组成第一个字节的位似乎并没有揭示出0x0A之前的位模式,并不是每两个以0x0A结尾的字节对都会触发错误。由于ofstream :: put位于for循环内,所以让我感到奇怪的是,写入的第一个错误就是值0x0A字节之前的循环。

1 个答案:

答案 0 :(得分:2)

如问题注释中所指出的那样,通过不显式打开写文件作为二进制Windows有时会修改写操作。修改ofstream :: open命令以包含二进制标志已解决了该问题。

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

替换

ofile.open("camdata.bin");