{ File:  fileint2.pas }

program FileInteri2;
{ Produce un file text contenente una sequenza di interi inserita in input
  (terminando con 0).
  Il nome del file da produrre viene fornito in input e letto mediante una
  variabile stringa.
  Infine si chiede il nome di un file da stampare: cosi' si puo'
  vedere la stampa sullo schermo del file appena prodotto.
}

type
  TipoNomeFile = string[12];
  { Equivalente al tipo packed array [1..12] of char;
    il TurboPascal permette su variabili di questo tipo l'uso di read e readln
    (non sui packed array)
  }

var
  emon : TipoNomeFile;	{ per leggere il nome dei file coinvolti }
 
  procedure CreaFile (nome: TipoNomeFile);
  { Produce un file text immettendovi interi letti in input terminati con 0.
    Il nome del file da creare e' passato per parametro. }
  var
    f : text;
    n : integer;

  begin { CreaFile }
    { assegnazione e apertura in scrittura;
      il nome del file concreto e' quello passato per parametro }
    assign(f, nome);
    rewrite(f);

    { lettura dati da input con immissione nel file
      (i numeri vengono distanziati da uno spazio bianco) }
    repeat
      write('   intero? ');
      readln(n);
      { se il numero letto e' zero, abbiamo finito
        e non memorizziamo lo zero nel file }
      if n <> 0 then
      begin
        writeln(f);
        write(f, n)
      end
    until n=0;
    { messaggio di fine operazione e chiusura file }
    writeln('creato file ', nome);
    close(f);
    writeln
  end; { CreaFile }

  { N.B.
    Nell'istruzione "if n<>0" precedente, provare a vedere cosa succede nel
    programma se si usa semplicemente "writeln(f,n)" invece delle due
    istruzioni di stampa (Suggerimento: se c'e' un EOLN in fondo al file,
    subito prima di EOF, il file non e' ancora finito dopo la lettura
    dell'ultimo intero che il file contiene).
    }


  procedure StampaFile (nome: TipoNomeFile);
  { Stampa un file text il cui nome e' passato per parametro. }
  var
    f : text;
    n : integer;

  begin
    { assegnazione e apertura in lettura;
      il nome del file concreto e' quello passato per parametro }
    assign(f, nome);
    reset(f);
    { lettura dal file e stampa su video }
    while not (eof(f)) do
    begin
      read(f, n);
      writeln(n);
    end;
    { chiusura del file usato }
    close(f);
  end; { StampaFile }


begin { FileInteri2 }
  write('dammi il nome di un file in cui vuoi memorizzare interi:');
  readln(emon)
  writeln('dati da immettere in ', emon, ' ( 0 per finire ) : ');
  CreaFile(emon);

  write('dammi il nome di un file che vuoi ti visualizzi in output:');
  readln(emon);
  StampaFile(emon);

  writeln('<RET> per finire');
  readln
end. { FileInteri2 }