I use while very frequently, but it's rare that I use do ... while, not because I don't want to, but because my own style doesn't need it.
My own style is to avoid goto at all costs, and almost to the same degree the use of continue or break within any loop, favouring instead setting a boolean for testing in the while clause. It might be a bit more wordy, but it makes more sense to me that way. I honestly cannot remember the last time I used a goto, althouh ISTR some of the IBM and Microsoft OS/2 API examples used it for error conditions.
The same applies to the use of return in the middle of a function, even in an error condition. I use a boolean instead. It's all down to maintaining flow and avoiding spaghetti code.
It's not all the time, but equally it's not uncommon for me to put in multiple assignments, comparisons and iterators in for(;
terminations, typically a boolean again that, for example, traps an error condition. About 20 years ago I worked on a large retails banking system where this was banned, because it too easily makes for write-only code. While I understand this, as long as it's well laid out and there's no obfuscation, it can often make perfect logical sense to put, say,
for ( i=0, ptr=array, bError=FALSE; i<10 && !bError; i++, ptr++)
however I'd say that example is pretty extreme for me, and I'd probably be already initialising at least so e of the variables elsewhere anyway, such as at declaration time.
One further thing, I frequently have a volatile NOP in an otherwise empty loop. This is so I can easily put a breakpoint inside the loop if necessary. It's volatile so it doesn't get optimised away.
But a blanket ban on while is a bit silly IMNSHO.