これ、r以外のgとbはrと同じサイズなので、途中でエラーでないっていう前提のロジックになってる
けど、どうせそういう前提なら
    g = fgetc(gfp);
    b = fgetc(bfp);
    fputc(r, outfp);
    fputc(g, outfp);
    fputc(b, outfp);
この部分は
    fputc(r, outfp);
    fputc(fgetc(gfp), outfp);
    fputc(fgetc(bfp), outfp);
こう書けよな。で余分な変数の宣言2つも消す