Robert Huth headed the hosts ahead before Cameron Jerome doubled the advantage after 81 minutes with a thunderous right-foot finish.
However, the Royals pulled one back just two minutes later thanks to Adrian Mariappa’s first goal for the club, but Tony Pulis’ men held on for the points despite claims for a penalty by Adam Le Fondre deep in stoppage time.
Stoke came closest to breaking the deadlock in a first half of few opportunities.
Adam Federici was the busier of the goalkeepers and he was called into action to firstly deny Ryan Shawcross from close range before the Australia international made an expert save to deny Peter Crouch scoring with an acrobatic volley.
Huth then saw his goalbound effort from Matthew Etherington’s corner deflected over the crossbar by Stephen Kelly’s defensive heroics as Reading held on into the break.
The hosts continued to threaten the visitors’ goal in the second half and eventually made the breakthrough after 67 minutes as Huth powered home Glenn Whelan’s corner in off the underside of the crossbar.
With nine minutes remaining Pulis’ side doubled their advantage as Jerome held off Alex Pearce before lashing his right-foot piledriver into the far corner past a helpless Federici.
However, Reading were not prepared to lie down and they pulled a goal back within two minutes thanks to Mariappa’s first goal for the club.
The defender stole a march on Glenn Whelan before sending his header into the back of the net to hand Brian McDermott’s team a lifeline, but the Royals – who have scored a host of important late goals in recent weeks in an unbeaten sequence of four league games – could not complete a last-gasp fightback on this occasion.
Le Fondre felt he had been knocked over by Ryan Shotton during the final attack of the match, but referee Michael Oliver remained unmoved. Reading remain 17th in the table, two points clear of the relegation zone, while Stoke stay 10th.