¿Cuál será el código equivalente de este programa (lea un archivo monocromático .BMP) en C ++?

Creo que si fuera a hacer esto, probablemente usaría un código un poco más como este:

#include
#include
#include
#include

#pragma pack (push, 1)
struct bmp_header {
char magic [2];
uint32_t fileSize;
uint32_t res;
uint32_t offset;
uint32_t header_size;
uint32_t ancho;
uint32_t altura;
uint16_t bits_por_pixel;
};
#pragma pack (pop)

std :: vector read_bmp (std :: string const & fname, int & w, int & h) {
bmp_header head;
std :: ifstream f (fname, std :: ios :: binario);

f.read ((char *) & head, sizeof (head));

if (head.bits_per_pixel! = 1)
regreso{};

w = ancho de cabeza;
h = altura de la cabeza;

// las líneas están alineadas en el límite de 4 bytes
int lineSize = (w / 8 + (w / 8)% 4);
int fileSize = lineSize * h;

std :: vector img (w * h);
std :: vector data (fileSize);

// encuentra bits
f.seekg (compensación de cabeza);

// leer datos
f.read ((char *) & data [0], fileSize);

// decodificar bits
int i, j, k, rev_j;
para (j = 0, rev_j = h – 1; j <h; j ++, rev_j–) {
para (i = 0; i <w / 8; i ++) {
int fpos = j * lineSize + i, pos = rev_j * w + i * 8;
para (k = 0; k <8; k ++)
img [pos + (7 – k)] = (datos [fpos] >> k) & 1;
}
}
volver img;
}

int main () {
int w, h, i, j;
std :: vector img = read_bmp (“test1.bmp”, w, h);
bits de char [] = “10”;

std :: cout << "Ancho:" << w << "\ n";
std :: cout << "Altura:" << h << "\ n";

para (j = 0; j <h; j ++) {
para (i = 0; i <w; i ++)
std :: cout << bits [img [j * w + i]] << "";
std :: cout << "\ n";
}

devuelve 0;
}

Contrariamente a las alegaciones de Filip, este sigue siendo solo un archivo, probablemente un poco más rápido que la versión C, y debería estar bien para cualquier tamaño de archivo. Ah, y como un pequeño bono menor, eliminé las pérdidas de memoria.

El código se ha vuelto un poco más largo (al menos en el recuento de líneas) pero bastante más fácil de leer y entender (al menos IMO). La mayoría de los cambios reales (especialmente la definición de la estructura para el encabezado del archivo) realmente se aplican tan bien en C como en C ++. Como me proporcionó los datos fácilmente, los modifiqué un poco para trabajar un poco más cerca de lo correcto (al menos una prueba rápida con un mapa de bits de 32 × 32 parecía producir resultados razonables, aunque definitivamente no he intentado probarlo a fondo en todos.

Si intentas compilar este programa con C ++, funcionará, así que diría que este es un programa equivalente. Si desea saber qué es C ++, una forma idiomática de resolver este problema, probablemente necesitará varias clases divididas en docenas de archivos .cpp y .h y al final será 3 veces más lento y no funcionará para ningún mapa de bits entre tamaños de 300 y 500 KB sin razón aparente …

quora no es definitivamente un sitio para resolver esto. pruebe Programmers Stack Exchange o Stack Overflow