660___________________________________________Глава 11

В данном случае можно использовать и цикл for:

for(; !feof(F)&&(strstr(S,SKey.c_str()) == NULL) ;

fgets(S,256,F)) ;

но цикл while выглядит наиболее естественным.

11.8.2.4 Прерывание цикла: операторы break. Continue, return, функци?
Abort

В некоторых случаях желательно прервать повторение цикла, проанализиро-
вав какие-то условия внутри него. Это может потребоваться в тех случаях, когда
проверки условия окончания цикла громоздкие, требуют многоэтапного сравне-
ния и сопоставления каких-то данных и все эти проверки просто невозможно раз-
местить в выражении условия операторов for, do или while.

Один из возможных вариантов решения этой задачи — ввести в код какой-то
флаг окончания (переменную). При выполнении всех условий окончания этой пе-
ременной присваивается некоторое условное значение. Тогда условие в операторах
for, do или while сводится к проверке, не равно ли значение этого флага принят'
му условному значению.

Другой способ решения задачи — использование оператора break. Он исполь
зуется как в операторах цикла, так и в структурах switch. Оператор break прерь:

вает выполнение тела любого цикла for, do или while и передает управление следу
ющему за циклом выполняемому оператору.

Например, цикл в рассмотренном в предыдущих разделах примере поиск:

текста в файле мог бы быть организован следующим образом:

while(!feof(F))
{

fgets(S,256,F) ;

if(strstr(S,SKey.c_str()) !=NULL) break;

}

Еще один способ прерывания цикла — использование оператора goto, переда-
ющего управление какому-то оператору, расположенному вне тела цикла.

Для прерывания циклов, размещенных в функциях, можно воспользоваться
оператором return. В отличие от оператора break, оператор return прервет не толь-
ко выполнение цикла, но и выполнение той функции, в которой расположен цикл.

Прервать выполнение цикла, а заодно — и блока, в котором расположен цикл,
можно также генерацией какого-то исключения (см. раздел 4.9). Наиболее часто в
этих целях используется процедура Abort, генерирующая «молчаливое» исключе-
ние, не связанное с каким-то сообщением об ошибке.

Описанные способы прерывали выполнение цикла. Имеется еще процедура
Continue, которая прерывает только выполнение текущей итерации, текущего вы-
полнения тела цикла и передает управление на следующую итерацию.

Чтобы продемонстрировать применение Continue, усложним рассмотренный
ранее пример поиска заданного фрагмента в текстовом файле. Пусть, например,
мы хотим найти заданный фрагмент не в любой строке файла, а только в такой, ко-
торая начинается с символа «*». Тогда поиск можно было бы организовать следую-
щим образом:

while(!feof(F))
<

fgets(S,256,F) ;

if(S[0] != '*') continue;

if(strstr(S,SKey.c_str()) !=NULL) break;

}

В этом варианте при первом символе в строке, отличном от «*>>, текущая ите-
рация прерывается и поиск в такой строке не производится. Таким образом, не