#include <stdio.h>
#include <assert.h>
typedef char cstring[128];
int fread_int(FILE* in);
int fread_byte(FILE* in);
int main() {
cstring filename;
printf("Filename: ");
fflush(stdout);
scanf(" %s", filename);
FILE* fin = fopen(filename, "rb");
if (! fin) {
printf("ERROR: file not found\n");
return 1;
}
int width;
int height;
int fhlen = 14;
int ihlen = 40;
int fsize;
int temp;
temp = fread_byte(fin);
assert (temp == 'B');
temp = fread_byte(fin);
assert (temp == 'M');
fsize = fread_int(fin);
fread_int(fin);
temp = fread_int(fin);
assert (temp == fhlen + ihlen);
temp = fread_int(fin);
assert (temp == ihlen);
width = fread_int(fin);
height = fread_int(fin);
temp = fread_int(fin);
assert (temp == 1 + (24 << 16));
temp = fread_int(fin);
assert (temp == 0);
fread_int(fin);
fread_int(fin);
fread_int(fin);
temp = fread_int(fin);
assert (temp == 0);
fread_int(fin);
int rowlen = width * 3;
int pixlen = height * rowlen;
assert (fsize == fhlen + ihlen + pixlen);
int allpix = 0;
int yellowpix = 0;
for (int ycoord=0; ycoord < height; ++ycoord) {
for (int xcoord=0; xcoord < width; ++xcoord) {
int b = fread_byte(fin);
int g = fread_byte(fin);
int r = fread_byte(fin);
++allpix;
if (r == 255 && g == 255 && b == 0) {
++yellowpix;
}
}
}
fclose(fin);
printf("%i out of %i pixels in %s are yellow.\n",
yellowpix, allpix, filename);
return 0;
}
int fread_int(FILE* in) {
int ans;
fread(&ans, sizeof(int), 1, in);
return ans;
}
int fread_byte(FILE* in) {
unsigned char ans;
fread(&ans, sizeof(char), 1, in);
return ans;
};