- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑 1:我已经确定了触发此问题的十六进制组合,但仍无法修复它。请参阅底部的编辑:
原帖:我正在尝试将数据从传感器传递到二进制文件。我正在使用制造商的示例代码和 DLL 一次获取 4096 个字节,然后尝试将其写入文件。我的最终文件大小在 4100 到 4114 字节之间变化,额外的位随机分布在整个文件中。
来自传感器的数据以 4096 长无符号字符结束。当我将每个字符发送到 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 vector 会导致二进制记录长度可变(长于 4096),额外位的位置是随机的。
我怀疑我的问题是从 unsigned char 到 ofstream::write(const char?)预期类型的转换,但我不知道如何解决它。提前致谢。
编辑 1:我已经确定最初触发此行为的双字节字符串始终以 0x0A 结尾,但第一个不正确写入的数据实际上是该对的第一个字节。因此,发送到 std:cout 的文本输出的十六进制等效值可能是 0x890A、0xC00A 或 0xC20A,但当输出中断时,该字节对始终写入 0x0A0D。
查看构成第一个字节的位似乎并没有揭示 0x0A 之前的位模式,也不是每一个以 0x0A 结尾的双字节对都会触发错误。由于 ofstream::put 位于 for 循环内,所以我觉得第一个写入错误是值 0x0A 字节之前的循环似乎很奇怪。
最佳答案
正如问题评论中所指出的,通过不显式打开写入文件作为二进制 Windows 偶尔会修改写入。修改 ofstream::open 命令以包含二进制标志已解决此问题。
ofile.open("camdata.bin", ios_base::binary);
替换
ofile.open("camdata.bin");
关于c++ - 为什么我的 ofstream 写入导致比预期更多的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032695/
我想在一个函数中打开一个文件,将打开的文件对象返回给 main,并在另一个函数中使用它函数来填充文件。编译器似乎告诉我,我正在尝试访问 iostream 的私有(private)成员。有没有办法做到这
我最近写了一个记录器类。编译这段代码时: std::ofstream *stream = new std::ofstream; stream->open( log_file_name.c_str()
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
我正在尝试实现一个记录器,它可以注册到多个流,如 ostringstream、ofstream 等。我试图实现这样的功能 void register_stream(std::ostream& a);
我有一个在线程上写入文件的类 class A{ public: void writeToFile(ofstream& outFile, obj &a) { //...
我有以下代码 void _log_message(const char* fmt, ...) { va_list arg; ofstream logfile; cout << "Open Lo
我刚刚开始阅读如何打开和编辑文件。使用 ifstream 时,如果文件不存在,则不会创建它。 引用下面的代码,条件 (!outfile) 何时为假,就好像文件不存在一样,构造函数将简单地创建它,因此总
#include #define LOGFATAL(msg) log(0, msg) std::ofstream *logst = NULL; void log(int sev, char *msg
我在使用 ofstream 时遇到问题一次将两个不同的输出写入两个不同的文件。程序编译运行正常,并向p1output.txt写入数据,但是当我打开p2output.txt时,除了第一行内容外是空白的:
我有一个“资源模块”类来管理我的应用程序的所有资源,它主要从一个包含所有内容的文件“RESOURCES.DAT”中读取。 从文件中请求新数据的所有对象都通过 ResourceModule,因此我可以管
我遇到流问题,程序无法打开我要写入的文件。最小完整可变代码如下: #include #include using namespace std; int main(){ string roo
我已经研究了好几个小时了,我只知道答案很简单。似乎无论我做什么我都无法打开文件。这是一个多类程序,所以在标题中我有 #include #include class A{ string path
所以我想写一个可以像这样使用的缩进输出类: Debug f; f.open("test.txt"); f }' and '') ofs #include using namespace std;
大家好... 抱歉我的英语不好,但是会说西类牙语... 这周,为了这个proyect的学习和工作,我想创建一个软件来制作文件(.us)... 示例 char name[50]; //Or string
我不想在 main() 中构造 ofstream。这是我所做的,但它没有编译: #include using namespace std; class test { private: ofs
谁能告诉我这是怎么回事? #include #include #include #include #include class writeManager { std::vector
我有一个 C++ 类,它将其数据写出到二进制 std::ofstream。该类将数据存储为 boost:shared_array 但我已经消除了这个问题。问题出在 ofstream 上对 write(
在我的程序中,我的 dataout: void outfile 没有写入文件,任何人都可以找出原因吗? using namespace std; #include #include #include
我想在文件上写点东西。但它只是没有像它必须假设的那样编写。 void main() { int accno; char name[20]; float deposit;
我遇到了一个奇怪的问题。我有两个函数,它们都有一个通过引用传递的 ofstream。但是,当我调用第二个函数时,正在打印第一个函数的一部分。 这是第一个函数: void GamePlay::dealD
我是一名优秀的程序员,十分优秀!