为什么我的流式写作会导致比预期更多的字节
Why does my ofstream write result in more bytes than expected?
编辑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");
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但存储 uint32 的字节不正确?
- 使用 c++ 将我的文件拆分为 128 个字节
- c_str() 只读取了我的字符串的一半,为什么?我该如何解决这个问题?是字节问题吗?
- 为什么我的流式写作会导致比预期更多的字节
- C++:了解我的计算机如何存储字节
- 我的字节数组到十六进制字符串转换器有什么问题,或者为什么它在写入文件时会在某个位置后剪切符号?
- 我的类包含 1 个枚举、2 个 int 和一个指针。它没有虚函数,但测量 20 字节。为什么?
- 为什么我的某些套接字数据被 "3f" 字节覆盖?
- 为什么我的无符号字节需要两倍大
- 为什么我的缓冲区占用的字节数超过了允许的字节数
- COM互操作传递了错误的指针,我的数据只有一个字节
- 为我的算法计算每字节的周期
- 为什么我的代码无法读取 QTcpSocket 上可用的字节数?想法?
- 获取我的IP地址并使用c++将其转换为字节
- 为什么我的字节数组被分割在0x00当我插入到我的数据库(SQL SERVER, c++)
- 我的4个字节去哪儿了
- 为什么我的程序在HTTP / 1.1中读取额外的字节