【发布时间】:2019-05-16 11:02:31
【问题描述】:
我有一个二进制文件,应该主要包含原始字节数据,该文件在CubeState 类中生成和处理。我进行了一些测试,似乎编写过程还可以。我得到的唯一问题是,有时它会记下 0x00 字符,每当发生这种情况时,我都会收到裁剪或没有数据。这是我如何写/读的例子。
CubeState currentParent = CubeState();
char* buf = new char[10];
std::ofstream ostr = std::ofstream("parents", std::ios::out | std::ios::binary);
ostr.write(currentParent.getContent().c_str(), 10);
ostr.close();
std::ifstream istr("parents", std::ios::in | std::ios::binary);
istr.read(buf, 10);
istr.close();
currentParent = CubeState(buf);
currentParent.getContent().c_str()在默认形式下会返回如下字符串——0x00 0x01 0x05 0x0B 0x17等等。
编辑
CubeState 是正在工作的黑匣子。如果你需要另一个例子 - 给你:
char* buf = new char[4];
std::ofstream ostr = std::ofstream("parents", std::ios::out |
std::ios::binary);
ostr.write("" + (char)0 + (char)1 + (char)5 + (char)11, 4);
ostr.close();
std::ifstream istr("parents", std::ios::in | std::ios::binary);
istr.read(buf, 4);
istr.close();
std::cout << buf << std::endl;
输出将为空,如果您在运行时检查buf - 它也是空的
【问题讨论】:
-
write将写入 10 个字符,无论从c_str()返回的字符串有多长。这真的是你想要的吗?如果字符串实际上没有那么长,则这是未定义的行为。 -
有趣的是,您如何在 CubeState 中处理 buf?也许您的代码会检查 buf 中的 char 是否不是空字符(这可能是因为您正在编写 0x00},然后它会停止处理,让您觉得数据被裁剪或未读取。跨度>
-
getContent()的输出始终是 10 个字符的字符串。我在运行时检查了buf,它是空的。 -
如果大小不是问题,那么除了您可能在
CubeState(buf)中处理错误的char指针外,我没有看到问题,没有考虑到它是二进制文件缓冲区而不是一个以 null 结尾的 C 字符串。 -
这不是minimal reproducible example。任何程序员要做的第一件事就是对字符串进行硬编码,而不是调用诸如
CubeState之类的函数来查看总体思路是否有效。您发布的代码我们不知道CubeState做了什么,它是否有错误等。花时间编写一个小的main函数,它对已知的硬编码字符串数据做同样的事情。如果它工作正常,那么只有在那时你才会引入函数调用。
标签: c++ file io binary binaryfiles