The follow all assumes 8-bit bytes, which is rather common. If you are using C99, you can use uint8_t, which won't exist if bytes are larger than 8 bits, meaning you'll get a compile-time error.
I don't completely understand the question. If you read one unsigned char from a file, you don't need to do any validation to discover whether it's in the range of a byte: it has to be.
Do I really just plug unsigned char in everywhere, instead of unsigned short? And how does that change my validation (i.e. if outside of range, reprompt user)?
Let's say your file starts with two single-byte values followed by a big-endian two-byte value. All you need is something like:
Real code will check for EOF before assigning to an unsigned char, of course.
unsigned char val1, val2, lobyte, hibyte;
unsigned short val3;
FILE *fp = fopen(..., "rb");
val1 = getc(fp);
val2 = getc(fp);
hibyte = getc(fp);
lobyte = getc(fp);
val3 = (hibyte << 8) | lobyte;
/* to write out */
putc(val3 >> 8, fp);
putc(val3 & 0xff, fp);