Remember that you can charge not only holding back, you can hold diagonals down-back or up-back, so you can charge while defending (down-back) or while jumping back (up-back).
Buffering is your answer as yx01 said, but let I throw some tips against shotos (who spam a lot of fireballs). I had a lot of problems with this in the past.
I'm not a Guile or Street Fighter expert, but versus shotos, don't enter always in a fireball war, you are in a disvantage.
You can always do a neutral jump (up) and let him get tired. Try to move a little closer to you opponent and let him think that you can jump the fireball and hit him. But don't jump always, just show to him that you can do it.
Try to do a neutral jump and hold back after the jump (you are buffering), when you touch the floor, press forward and punch, sonic boom, then walk forward (show no fear). Get ready for another fireball.
If he throw another, you can jump and hit him or defend.
If he block or the sonic boom hits, you can follow a high punch to bug him.
If he jumps, you can use crouching high punch to counter or jump and air-throw.
Keep a good distance for you not to him and poke him to KO.
In (Super) Street Fighter 4 you can use the focus attack (medium kick + medium punch) to get closer as another option. Remember to cancel the focus attack with a dash (forward, forward) after absorve the fireball.