Cicli do-while

Un ulteriore modo per stampare i file fino all'ultimo carattere ma non oltre usa i cicli do-while. Questi cicli sono naturalmente utilizzabili anche per problemi diversi dalla lettura dei file.

I ciclo do-while sono simili ai cicli while con la differenza che il corpo del ciclo viene eseguito almeno una volta.

In altre parole, se la condizione è inzialmente falsa, il corpo di un ciclo while non viene mai eseguito, mentre quello del ciclo do-while viene comunque eseguito una prima volta.

La sintassi dei cicli do-while è la seguente:

do {
  istruzione1;
  istruzione2;
  ...
} while (condizione);

Questo ciclo corrisponde alla sequenza:

istruzione1;
istruzione2;
...
if(!condizione) esci
istruzione1;
istruzione2;
...
if(!condizione) esci
istruzione1;
istruzione2;
...

La differenza con i cicli while era che in questi ultimi il primo passo della sequenza è if(!condizione) esci, ossia viene eseguito il controllo della condizione prima di eseguire per la prima volta il corpo del ciclo.

Il programma di lettura da file si può riscrivere usando un ciclo do-while, che presenta il vantaggio che la condizione x!=-1 viene verificata soltanto dopo aver eseguito una prima volta il corpo del ciclo. Questo risolve il problema del valore iniziale di x, dal momento che la x viene assegnata nel corpo del ciclo. Il seguente programma FineDoWhile.java implementa questa soluzione.

import java.io.*;

class FineDoWhile {
  public static void main(String args[])
  throws IOException {
    FileReader fr;
    fr=new FileReader("prova.txt");

    int x;
    char c;

    do {
      x=fr.read();
      if(x!=-1) {
        c=(char) x;
        System.out.println(c);
      }
    }
    while(x!=-1);
  }
}

Notare che ogni ciclo do-while può venire convertito in un ciclo while, come segue. Si consideri il seguente ciclo:

do
  corpo
while(condizione);

Questo ciclo si può riscrivere come:

corpo
while(condizione)
  corpo