{ File: fileint1.pas }

program FileInteri;

{ 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.  Il nome del file deve essere inserito in input,
  terminandolo con il carattere '='.
  Infine si chiede il nome di un file da stampare: cosi' si puo'
  vedere la stampa sullo schermo del file appena prodotto.
}

const
  DIMNOMEFILE = 12 ;   { un file ha un nome di al piu' 12 caratteri }

type
  TipoNomeFile = packed array [1..DIMNOMEFILE] of char;

var
  emon : TipoNomeFile;	{ per leggere il nome dei file coinvolti }

  procedure LeggiNomeFile (var nome: TipoNomeFile);
  { Legge da input un nome di file e lo memorizza in nome.
    Il nome del file e' terminato dal carattere =
    Il nome del file potrebbe essere piu' breve di 12 caratteri;
    in tal caso viene operato un "blank filling" cioe' il riempimento del resto
    del vettore con spazi bianchi.
  }

  var
    i, j : 1..DIMNOMEFILE;   { per scandire il resto del vettore al momento
                               del blank filling }
    c : char;

  begin { LeggiNomeFile }
    writeln('lettura del nome del file (NOMEFILE.EXT):');
    writeln(' TERMINARE IL NOME CON ''=''');

    read(c);            { lettura primo carattere }
    i := 1;             { indice prima componente da riempire }

    while (i < DIMNOMEFILE) and (c <> '=') do
    begin
      nome[i] := c;
      i := i+1;
      read(c);
    end;
    readln; { scartiamo eventuali caratteri addizionali lasciati in input }

    { riempimento del resto del vettore }
    for j := i to DIMNOMEFILE do nome[j] := ' '
  end; { LeggiNomeFile }


  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 { FileInteri }
  LeggiNomeFile(emon);
  writeln('dati da immettere in ', emon, ' ( 0 per finire ) : ');
  CreaFile(emon);

  writeln(' adesso stampo un file a tua scelta:');
  LeggiNomeFile(emon);
  StampaFile(emon);

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