{ 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 }