Структура do...while используется для организации циклического выполнения оператора или совокупности операторов, называемых телом цикла, до тех пор, пока не окажется нарушенным некоторое условие. Синтаксис управляющей структуры do...while:
do оператор while (условие);
Структура работает следующим образом. Выполняется оператор тела цикла. Затем вычисляется условие выражение, которое должно возвращать результат булева типа. Если выражение возвращает true (не нулевое значение), то повторяется выполнение тела цикла и после этого снова вычисляется выражение. Такое циклическое повторение цикла продолжается до тех пор, пока проверяемое выражение не вернет false (нуль). После этого цикл завершается и управление передается оператору, следующему за структурой do...while.
Поскольку проверка выражения осуществляется после выполнения тела цикла, то цикл будет заведомо выполнен хотя бы один раз, даже если выражение сразу ложно. С другой стороны, программист должен быть уверен, что выражение рано или поздно вернет false. Если этого не произойдет, то программа «зациклится», т.е. цикл будет выполняться бесконечно. Иногда такие бесконечные циклы используются. Но в этом случае внутри тела цикла должно быть предусмотрено его прерывание в какой-то момент, например, оператором break или другими способами.
Обычно оператор do целесообразно использовать для организации поиска среди множества объектов такого, который обладает каким-то определенным свойством. Причем заранее должно быть известно, что множество объектов не пустое, т.е. хотя бы один объект в нем имеется. К тому же должен быть критерий, позволяющий проверить, не является ли текущий объект последним. Тогда тело цикла включает операторы перехода к новому объекту и какой-то его обработки, а условие while включает проверку, является ли объект не последним и отсутствуют ли у него искомые свойства. Если объект последний или искомые свойства найдены, выполнение цикла прерывается. Если же объект не последний и искомые свойства у него не найдены, осуществляется переход к следующему объекту. Если множество проверяемых объектов может быть пустым, следует использовать другой оператор цикла while. Если число повторений циклов заранее известно, лучше применять оператор for.
Ниже приведен пример, в котором в файле File1.txt ищется строка, содержащая фрагмент текста (последовательность символов с учетом регистра), указанный пользователем в окне редактирования Edit1. Проверка наличия в строке заданного фрагмента проверяется функцией strstr. Окончание файла проверяется функцией feof.
FILE *F;
char S[256] = "";
AnsiString SKey = Edit1->Text;
if ((F = fopen("File1.txt","r")) == NULL)
{
ShowMessage("Файл не найден");
return;
}
do
fgets(S, 256, F);
while (! feof(F)&&(strstr(S, SKey.c_str()) == NULL));
fclose(F);
if (strstr(S, SKey. c_str()) == NULL)
{ ... }
Цикл будет выполняться, до тех пор, пока не достигнут конец файла и пока функция strstr возвращает NULL (фрагмент не найден). Если хотя бы одно из этих условий нарушается (достигнут конец файла или найден фрагмент), выполнение цикла прекращается.