{ File: fileintg.pas }

program FileGeneralizzati2;
{ (1)
  Produce un file di interi memorizzandovi interi dati in input.
  Il nome del file prodotto viene chiesto in input all'utente
  (0 termina l'immissione di dati).

  (2)
  Successivamente viene chiesto all'utente il nome di un file di interi
  (ad esempio quello appena creato) da usare come file di input.
  I dati di questo file vengono letti e stampati su video.

  (3)
  Successivamente vengono chiesti all'utente due nomi di file.
  I dati contenuti nel primo file vengono scaricati nel secondo file
  (si presume che il primo sia un file di interi e tale sara' anche il secondo)

  (4)
  Infine vengono chiesti all'utente due nomi di file, entrambi esistenti in
  memoria secondaria.
  I dati del primo file vengono "appesi" nel secondo file.
}

type 
  TipoFileInteri = file of integer;
  TipoNomeFile   = string;  { Tipo equivalente a packed array of char.
                              Il turbopascal permette l'operazione READ, READLN
                              su variabili di tipo string }
 
 
var 
  emon, emon2 : TipoNomeFile;	{ per leggere i nomi dei file coinvolti }


  procedure CreaFileInteri (nome: TipoNomeFile);
  { Produce un file in memoria secondaria, immettendovi interi letti in input
    e  terminati con 0.  Il nome del file da creare e' passato per parametro. }
 
  var
    f : TipoFileInteri;
    n : integer;

  begin { CreaFileInteri }
    { 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 }
    repeat
      write('   intero? ');
      readln(n);

      if n <> 0 then { se il numero letto e' zero ... }
        write(f, n)  { ... abbiamo finito e non memorizziamo lo zero nel file }
    until n = 0;

    { messaggio di fine operazione e chiusura file }
    writeln('creato file ', nome);
    writeln;
    close(f)
  end; { CreaFileInteri }


  procedure StampaFileInteri (nome: TipoNomeFile);
  { Prende il nome di un file e ne legge i dati, stampandoli su video. }
  var 
    f : TipoFileInteri;
    n : integer;

  begin { StampaFileInteri }
    { 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 dei file usati }
    close(f)
  end; { StampaFileInteri }


  procedure CopiaFileInteri (nome1, nome2: TipoNomeFile);
  { Copia il file 'nome1' nel file 'nome2' }
  var 
    f1, f2 : TipoFileInteri;
    n      : integer;

  begin { CopiaFileInteri }
    { assegnazione e apertura in lettura del primo file;
      il nome del file concreto e' quello passato per parametro }
    assign(f1, nome1);
    reset(f1);
    { assegnazione e apertura in scrittura del secondo file;
      il nome del file concreto e' quello passato per parametro }
    assign(f2, nome2);
    rewrite(f2);
 
    { lettura dal primo file e stampa sul secondo }
    while not eof(f1) do
    begin
      read(f1, n);
      write(f2, n)
    end;
    { chiusura dei file usati }
    close(f1);
    close(f2)
  end; { CopiaFileInteri }


  procedure AppendiFileInteri (nome1, nome2: TipoNomeFile);
  { "appende" il file 'nome1' al file 'nome2', cioe' copia il contenuto del
    file 'nome1' in 'nome2', dopo i dati che gia' sono in 'nome2'.
    Per fare cio' i dati del secondo file vengono copiati in un terzo,
    poi il secondo file viene aperto in scrittura (e quindi azzerato),
    vi vengono copiati i dati contenuti nel terzo e successivamente vi
    vengono copiati quelli contenuti nel primo. }
  var
    f1, f2, f3 : TipoFileInteri;
    n          : integer;

  begin
    { copia del secondo file in un terzo file
      ATTENZIONE: il terzo file e' un file "di servizio". Esso viene associato
      ad un file concreto chiamato 'buffer.dat'. In esso verranno copiati i
      dati del secondo file prima di aprire il secondo file in scrittura. }
 
    { assegnazione e apertura in lettura del secondo file }
    assign(f2, nome2);
    reset(f2);
    { assegnazione e apertura in scrittura del terzo file }
    assign(f3, 'buffer.dat');
    rewrite(f3);
 
    { lettura dal secondo file e stampa sul terzo }
    while not eof(f2) do
    begin
      read(f2, n);
      write(f3, n)
    end;
 
    { Ora il secondo file viene aperto in scrittura per copiarvi
      in sequenza il contenuto del terzo e quello del primo file.
      L'effetto sara' che il vecchio contenuto del secondo file sara' di nuovo
      memorizzato nel secondo file, seguito da quello del primo.
      Ovviamente il terzo file ora deve essere aperto in lettura. }
    rewrite(f2);
    reset(f3);
 
    { file3 ---> file2 }
    while not eof(f3) do
    begin
      read(f3, n);
      write(f2, n)
    end;

    { di seguito, file1 ---> file2,
      ma prima bisogna aprire il primo file in lettura ...}
    assign(f1, nome1);
    reset(f1);
    while not eof(f1) do
    begin
      read(f1, n);
      write(f2, n)
    end;

    { chiusura dei file usati }
    close(f1);
    close(f2)
  end; { AppendiFileInteri }

 
begin { FileGeneralizzati2 }
  {1}
  writeln('{1}');
  write('dammi il nome di un file in cui vuoi memorizzare interi:');
  readln(emon);

  writeln('dati da immettere in ', emon, ' ( 0 per finire ) : ');
  CreaFileInteri(emon);
 
  {2}
  writeln;
  writeln('{2}');
  write('dammi il nome di un file che vuoi ti visualizzi in output:');
  readln(emon);
  StampaFileInteri(emon);
 
  {3}
  writeln;
  writeln('{3}');
  write('dammi il nome di un file che vuoi copiare in un altro:');
  readln(emon);
  write('dammi il nome di un file IN CUI vuoi che io copi ', emon, ':');
  readln(emon2);
  CopiaFileInteri(emon, emon2);
  writeln;
  writeln('ecco il file ', emon);
  StampaFileInteri(emon);
  writeln(' ed ecco il file ', emon2);
  StampaFileInteri(emon2);

  {4}
  writeln;
  writeln('{4}');
  write('dammi il nome di un file che vuoi appendere in un altro:');
  readln(emon);
  write('dammi il nome di un file IN CUI vuoi che io appenda ', emon, ':');
  readln(emon2);
  writeln;
  writeln('prima dell'' append ');
  writeln('ecco il file ', emon);
  StampaFileInteri(emon);
  writeln(' ed ecco il file ', emon2);
  StampaFileInteri(emon2);
  AppendiFileInteri(emon, emon2);
  writeln;
  writeln('dopo l'' append ');
  writeln('ecco il file ', emon);
  StampaFileInteri(emon);
  writeln(' ed ecco il file ', emon2);
  StampaFileInteri(emon2);
end. { FileGeneralizzati2 }