There's no better or best
They do basically the same thing: repeat to do the same instruction until the exit condition happens.
for ([initialisation]; [condition]; [post execution instruction])
{
[loop instructions]
}
while ([condition])
{
[loop instructions]
}
do
{
[loop instructions]
} while ([condition]);
So the for offers [initialization], that is run only once, before the loop starts and [post-loop instructions], that is run after every time the body of the loop is executed (except when one leaves the loop before [condition] turns false, e.g. by a break or other means).
Of course, this could be expressed with a while loop as well:
[initialization]
while ([condition])
{
[loop instructions]
[post execution instruction]
}
The do-while is special in a way, that the [condition] is at the end of the loop, so the body always runs at least once, while with for and while, if the [condition] is evaluated false, the body may not run a single time.
A do-while could be expressed as a "regular while loop" as well:
[loop instructions]
while ([condition])
{
[loop instructions]
}
So, as you see, for, while, do-while can be used interchangeably (while some extra work), so which one to pick is mostly a matter of taste.
Of course, if you have an [initialization] and a [post execution instruction], then it makes sense to choose the for loop, but it's not compulsory.