首先,我将一些int变量写入.bin文件。然后我试着读回那些数字,但我没有那样做。
这就是我的写作方式:
std::ofstream OutFile;
OutFile.open("encode.bin", std::ios::out | std::ios::binary);
for(int i = 0; i < all.size(); i++){
int code = codes[i];
OutFile.write(reinterpret_cast<const char *>(&code), sizeof(int));
}
OutFile.close();
这就是我编写数字时我的.bin文件的样子:65, 66, 66, 257, 258, 260
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 41 00 00 00 42 00 00 00 42 00 00 00 01 01 00 00
00000010: 02 01 00 00 04 01 00 00
endian有问题吗?我看到数字是相反的。
我是怎么看的:
std::vector<int> allCodes;
std::ifstream inputD(file, std::ios::binary);
std::vector<char> buffer((
std::istreambuf_iterator<char>(inputD)),
(std::istreambuf_iterator<char>()));
for (auto a : buffer) {
data.push_back(static_cast<int>(a));
allCodes.push_back(a);
};
当我显示向量时,前三个数字(65, 66, 66)
被正确读取,其间的零数很少。
这是显示器的外观:
答案 0 :(得分:1)
首先,你不应该在这里使用.menu {
height:60px;
background-color:#272F38;
}
.menu label {
display:inline;
font-family: "Lato Bold";
font-size:16px;
color:#767676;
font-weight: bold;
cursor: pointer;
width:100%;
}
.menu input {
position: absolute;
left: -9999px;
}
.menu ul {
display:none
}
#toggle:checked ~ .menu ul {
display:block;
font-size:20px;
font-family:"Lato Bold";
font-weight: bold;
color:black;
}
,因为字节顺序 - 你失去了可移植性。在您的情况下,您可以写出 4字节长的整数。然后,您尝试将数字读取为 char ,其中只有 1个字节。这就解释了为什么你看到前三个数字的正确输出(它们在0到255之间)以及为什么它们之间有一些零。
在这里,我在硬盘上找到了一些代码,它可能写得更好,但是它可以完成工作并且比你的解决方案更安全。
reinterpret_cast
使用示例:
template<typename T> void ReadInteger(T &Output, const char* Buffer)
{
static_assert(std::numeric_limits<T>::is_integer, "return type cannot be non-arithmetic or floating point");
Output = 0;
for(unsigned int i = 0; i<sizeof(T); i++)
{
Output <<= 8;
Output |= Buffer[i];
}
}
template<typename T> void WriteInteger(T Value, char* Buffer)
{
static_assert(std::numeric_limits<T>::is_integer, "first parameter cannot be non-arithmetic or floating point");
for(unsigned int i = 0; i<sizeof(T); i++)
{
Buffer[sizeof(T)-i-1] = static_cast<char>(Value&0xff);
Value >>= 8;
}
}