Newsgroup: it.comp.lang.pascal
Titolo: W i file :)

Salve, sto realizzando un programma col quale tramite un record contenente
nome,cognome e data di nascita di uno studente venga il tutto memorizzato su
di un file,
il record l'ho cosě strutturato:
type data= record
        giorno,mese:string[2];
        anno:string[4];
        end;
        classe=record
        nome,cognome:string[20];
        annon:data;
        end;
il file:
type miofile:text;
la domanda č: Come posso modificare la data di nascita di un alunno
contenuta nel file?
Vorrei poi gestire la creazione del file in modo che quando viene inserito
il nome di un nuovo file questo venga ricercato nella dir in modo da non
creare lo stesso file nella stessa dir com'č possibile farlo? Pensa che si
debba utilizzare qualche lib?
Grazie anticipatamente per l'aiuto :)
--
=Omega============
Hands On
==================

Be per prima cosa il file non lo dichiarerei "text" ma "file of classe" 
in quanto su file tipizzati si puo' oltre che leggere e scrivere alla 
fine anche leggere in un punto qualsiasi (e quindi eseguire una ricerca) 
o scrivere sopra un record già esistente.
Per secondo vorrei sapere per quale motivo hai dichiarato il giorno, il 
mese e l'anno come stringa e non come byte o integer che si vuole; 
secondo me le ricerche e le comparazioni tra date funzionerebbero meglio 
  no?
Per concludere rispondo alle tue domande:
Domanda:
Come posso modificare la data di nascita di un alunno  contenuta nel file?
Risposta:
Con un file di testo è un po' ostico mentre se il file è tipizzato e ho 
trovato il puntatore del record che mi interessa basta scrivere:
Seek(F, Puntatore);
Read(F, R);
R.Data.giorno := NuovoGiorno;
R.Data.mese   := NuovoMese;
R.Data.anno   := NuovoAnno;
Seek(F, Puntatore); (* oppure Seek(F, FilePos(F)-1); *)
Write(F, R);
Ovviamente F e di tipo "file of classe" e R è di tipo "classe"
Domanda (modificata da me):
Come controllo se un record è già presente nel file in maniera da non 
aggiungere duplicati?
Risposta:
Basta creare una funzione che ricerchi il record all'interno del file e 
ritorni se lo ha trovato oppure no (meglio che ritorni il puntatore in 
maniera da poter utilizzare la funzione anche per altri scopi)
Function RecordEsistente(Nome, Cognome : String) : Longint;
Var
   F       : File Of Classe;
   R       : Classe;
   Trovato : Longint;
Begin
   Trovato := -1;
   Assign(F, NomeDelFile);
   Reset(F);
   While (Not Eof(F)) And (Trovato < 0) Do
	Begin
  	  Read(F, R);
	  If (R.Nome = Nome) And (R.Cognome = Cognome)
           Then
             Trovato := FilePos(F)-1;
	End;
   Close(F);
   RecordEsistente := Trovato;
End;
L'utilizzo è semplice:
If (RecordEsistente(Nome, Cognome) < 0) Then
    Begin
      ...... Inserimento nuovo record .....
    End;
Tieni presente che la funzione cosi' come' ora non controlla se il file 
già esiste e non tiene presente la maniera di scrittura del nome e del 
cognome ovvero se scrivo "Nando" come nome, sarà diverso da "nando" 
oppure da "NANDO"; per sopperire a questo basterebbe trasfornare il nome 
ed il cognome sia letto da file che passato in maiuscolo con una 
funzione simile a questa:
Function UpperString(S : String) : String;
Var
   I : Integer;
Begin
   For I := 1 To Length(S) Do S[I] := UpCase(S[I]);
   UpperString := S;
End;
mentre per controllare se il file esiste ci sono due tecniche:
la prima è in fase di apertura
Assign(F, NomeFile)
{$I-}
Reset(F);
{$I+}
(* Se IoResult è diverso da 0 si è verificato un errore *)
If IoResult <> 0 Then
    Begin
      Rewrite(F);
    End;
la seconda è un po' piu' carina:
Function EsisteFile(NomeFile : String) : Boolean;
Var
    Nome : SearchRec;
Begin
   FindFirst(NomeFile, Archive, Nome);
   EsisteFile := (DosError = 0);
End;
Ciao,
David

no?
Su questo non ti do torto, il problema è che la traccia richiedeva
esplicitamente che i dati fossero di tipo stringa :)
Ti ringrazio ancora una volta del tuo aiuto e delle tue delucidazioni
Ciao
