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