C++ 在C++;风格vs C风格

C++ 在C++;风格vs C风格,c++,C++,很久以前,我用C编写了一个函数来编写bmp头。我使用二进制运算符将uint_16和uint_32直接解析为一个char[54]数组,该数组考虑了端性和可移植性 我学习C++有一段时间了,现在我尝试用STD::OFFROW代替文件*来重写C++函数中的函数。我产生的C++代码看起来很糟糕,不适合使用二进制代码。有没有更好或更合适的方法来编写C++头文件?(最好是便携式的,并处理持久性) 目前看起来是这样的: void writeHeader(int width, int height, std::

很久以前,我用C编写了一个函数来编写bmp头。我使用二进制运算符将uint_16和uint_32直接解析为一个char[54]数组,该数组考虑了端性和可移植性

我学习C++有一段时间了,现在我尝试用STD::OFFROW代替文件*来重写C++函数中的函数。我产生的C++代码看起来很糟糕,不适合使用二进制代码。有没有更好或更合适的方法来编写C++头文件?(最好是便携式的,并处理持久性)

目前看起来是这样的:

void writeHeader(int width, int height, std::ofstream file)
{
    char bmpSign[2] = {'B', 'M'};
    uint filesize = width*height*3+54;
    uint reserved = 0;
    uint headersize = 54;
    uint infoHeader = 40;
    ushort colors = 1;
    ushort bitsPerPixel = 24;
    uint compression = 0;
    uint imgSize = width*height*3;
    uint xPels = 0;
    uint yPels = 0;
    uint usedColors = 0;
    uint impColors = 0;

    file.write(bmpSign, 2*sizeof(char));
    file.write(reinterpret_cast<char*>(filesize),     sizeof(int));
    file.write(reinterpret_cast<char*>(reserved),     sizeof(int));
    file.write(reinterpret_cast<char*>(headersize),   sizeof(int));
    file.write(reinterpret_cast<char*>(infoHeader),   sizeof(int));
    file.write(reinterpret_cast<char*>(width),        sizeof(int));
    file.write(reinterpret_cast<char*>(height),       sizeof(int));
    file.write(reinterpret_cast<char*>(colors),       sizeof(ushort));
    file.write(reinterpret_cast<char*>(bitsPerPixel), sizeof(ushort));
    file.write(reinterpret_cast<char*>(compression),  sizeof(int));
    file.write(reinterpret_cast<char*>(imgSize),      sizeof(int));
    file.write(reinterpret_cast<char*>(xPels),        sizeof(int));
    file.write(reinterpret_cast<char*>(yPels),        sizeof(int));
    file.write(reinterpret_cast<char*>(usedColors),   sizeof(int));
    file.write(reinterpret_cast<char*>(impColors),    sizeof(int));
}

处理平台端性的代码应该重用。该代码与您是使用
FILE*
还是
std::fstream
写入数据无关

你唯一需要改变的是

fwrite(bmp_header, 1, 54, bitmap_destination); 
可替换为:

file.write(reinterpret_cast<char*>(bmp_header), 54);
file.write(reinterpret\u cast(bmp\u头),54);

您是如何在C版本中“处理endianness”的?请不要将short与sizeof(short)一起使用。。。改为使用(stdint.h):int16_t和sizeof(int16_t),…首先,您的C代码总是使用相同的endianness。你不是在检查机器是大的还是小的(一个简单的测试)。第二,你在C++中编写文件,同时构建缓冲区,然后用C语言一次写。你也应该能够在C++中做这件事。关于处理种子,你也可以使用<代码> HtONLL()/<代码>函数族,从代码> ARPA/IPEN.H./> >这是在大多数POSIX兼容环境中可用的。@ BigBadWolf:是的,看起来是这样。但是在C++版本中,你没有明显的理由就把它删去了。只要把它放回去……就可以为头创建一个
struct
,也可以调用
sizeof(BmpHeader)
,不?@crush,不。
sizeof(BmpHeader)
不太可能是
54
,因为
struct
@crush的成员变量之间存在填充,我可以肯定地告诉你,这会因为填充而崩溃。您必须使用
\uuu declspec(align(1))
或类似的方法声明这样的结构,这是不可移植的。@BigBadWolf nope、msvc、clang,甚至borland和intel编译器似乎也支持这一点。@MateuszGrzejek:一切都是特定于编译器的,真的。甚至是由标准定义的特性。与标准的某些尖端或深奥的特性相比,我更依赖于像
pack
once
这样的通用术语。
file.write(reinterpret_cast<char*>(bmp_header), 54);