Reading stay top of the Championship after they made it three wins from three with second half goals from Michael Morrison and Lucas Joao.
Morrison headed the Royals in front early in the second half before Joao bagged his second goal of the season to double the lead.
Cardiff pulled a goal back with nine minutes left through Lee Tomlin but Reading held on for another win.
The Royals extended their winning run to three games in the league and and are the only side in the division with a 100% winning start.
Veljko Paunović made one change from the side that beat nine-man Barnsley as John Swift was replaced by Yakou Meite.
Meanwhile, Cardiff lined up with two former Royals in their starting eleven with Sean Morrison and Leandro Bacuna.
Both sides were locked in an even start to the game but it was Reading who forged the first chance of the game.
Yakou Meite made a run in behind and was found brilliantly by a long ball by skipper Liam Moore, but his headed effort was saved comfortably by Alex Smithies.
Junior Hoilett picked up the first booking of the game as he cynically brought down Ovie Ejaria as he looked to break forward for the visitors.
The Bluebirds then had their first sniff of goal after 27 minutes when Kieffer Moore found Bacuna in the box but his volley was easily held by Rafael.
Michael Olise went down under the challenge of Jordi Osei-Tutu, leading some players to appeal for a penalty kick, but the referee waved away the shouts after the French midfielder went down rather easily.
It was the Royals who continued to have the better of the half as danger man Lucas Joao caused problems for Morrison at the back for Cardiff in an intense battle.
He headed just wide from a corner before he used his immense strength to shrug off Morrison, and despite being fouled, he managed to get his shot away which was parried out by Smithies as the first-half ended goalless.
The Royals scored just two minutes into the second half and were good value for their lead.
Olise’s out-swinging free kick was met by the head of Michael Morrison as he stooped low and glanced the ball into the top right hand corner out of the reach of Smithies to give Paunović ‘s side the ideal start to the half.
Lucas Joao came close to getting a strike away on goal after he breezed past a few defenders but a last ditch tackle from Curtis Nelson prevented the Portuguese striker from pulling the trigger.
Both sides made changes on the hour mark as Lee Tomlin came on for Will Vaulks for the home side, while Felipe Araruna was forced off with an injury and was replaced by Tom Holmes.
Rafael came to Reading’s rescue as he reacted superbly to a deflected shot from Bacuna which struck Morrison’s foot but the Brazilian keeper adjusted quickly to keep the ball out with his foot.
And just moments after the save, the Royals capitalised to double their lead.
Josh Laurent worked his way into the box and squared he ball to Joao who kept his marker at bay and showed superb footwork to get the ball under control before firing it into the net.
Rafael made another important stop to keep Cardiff at bay as he got down low to collect Osei-Tutu’s cross as the full-back looked to pick out a blue shirt in the middle.
But they weren’t able to keep the clean sheet as substitute Tomlin scrambled the ball over the line from Marlon Pack’s corner as the Royals conceded their first league goal of the season.
It was a nervy end to the game for Paunovic’s team as they had to endure nine minutes of added time, but they did so to wrap up another victory.
Reading host Watford next Saturday at the Madejski Stadium, who were relegated from the Premier League last season.
Cardiff City: Smithies, Osei-Tutu, Morrison, Nelson, Cunningham, Bacuna, Vaulks, Pack, Ojo, Moore, Hoilett
Subs: Glatzel, Murphy, Tomlin, Whyte, Bamba, Day, Bagan
Reading: Rafael, Araruna, Morrison, Moore, Richards, Laurent, Rinomhota, Meite, Ejaria, Olise, Joao
Subs: McIntyre, Baldock, Gibson, Southwood, Aluko, Holmes, Puscas
Goals: Morrison 47′, Lucas Joao 66′, Tomlin 81′