试图找出如何将无符号整数写入二进制文件。我认为整数不应该占用4个字节以上的空间。我在下面的代码中有两部分标记为 Write v.1 和 Write v.2 。预期的行为将是两个都可以工作,但只有版本2,但它占用更多的空间,然后我认为它应该。
如何将无符号整数写入4字节的二进制文件?如果不可能,请解释原因为何?
如何在版本1中读取和输出无符号整数。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
unsigned int x = 4294967295;
ofstream outfile;
streampos begin,end;
ifstream myfile;
streampos size;
char * memblock;
// Write v.1
outfile.open("example.bin", ios::binary | ios::out | ios::trunc);
outfile.write((char*)&x, sizeof(unsigned int));
outfile.close();
// Output size
myfile.open ("example.bin", ios::binary | ios::in);
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
cout << "size is: " << (end-begin) << " bytes.\n";
// Output content
size = myfile.tellg();
memblock = new char[size];
myfile.seekg (0, ios::beg);
myfile.read (memblock, size);
myfile.close();
cout << "content: " << memblock << "\n";
delete[] memblock;
myfile.close();
// Write v.2
outfile.open("example.bin", ios::binary | ios::out | ios::trunc);
outfile << x;
outfile.close();
// Output size
myfile.open ("example.bin", ios::binary | ios::in);
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
cout << "size is: " << (end-begin) << " bytes.\n";
// Output content
size = myfile.tellg();
memblock = new char[size];
myfile.seekg (0, ios::beg);
myfile.read (memblock, size);
myfile.close();
cout << "content: " << memblock << "\n";
delete[] memblock;
}
size is: 4 bytes.
content: ����
size is: 10 bytes.
content: 4294967295
答案 0 :(得分:2)
您必须定义二进制文件的格式,然后转换 你的整数。典型的网络格式是 big-endian,所以你会使用类似的东西:
void
toBuffer( unsigned int value, std::vector<char>& buffer )
{
buffer.push_back((value >> 24) & 0xFF);
buffer.push_back((value >> 16) & 0xFF);
buffer.push_back((value >> 8) & 0xFF);
buffer.push_back((value ) & 0xFF);
}
用类似的东西从缓冲区中提取它
读。 (显然,我忽略了很多错误处理。)你
可以使用std::ostream::write
和std::istream::read
来撰写
并读取缓冲区(假设文件已以二进制文件打开)
模式,并充满了“C”语言环境。)
但是,当然,您可能需要或需要不同的二进制格式。
答案 1 :(得分:1)
V1。 - 你写成二进制 - 读入数组 - 打印为字符串
问题在于读取数据的呈现,因为原始数据表示为以字符串形式的空终止数组。
unsigned int content;
outfile.read((char*)&content, sizeof(unsigned int));
然后内容不再是字符数组,而是序列化为int