Newsgroup: it.comp.lang.pascal
Titolo: scrittura su file : probl. strano

come potete vedere dal testo del programma, il mio scopo è
quello di aggiungere in un file di testo 4 campi per ogni riga.
Il problema è che quando rieseguo il programma per aggiungere altre
informazioni
l'output di fpc (sotto linux) mi dà il seguente errore:
---------------------------------------
[claudio@luna mio-programma]$ ./conto
mese odierno (mm):
5
digita cosa hai comprato :
CD riscrivibili
quanto hai speso (in EURO) ?
10.23
che giorno e' stato (gg) ?
26
Eventuale commento :
negozio sotto casa
vuoi inserire un altro record (S/N)?
n
la lista e' stata salvata nel file maggio.txt.
[claudio@luna mio-programma]$ ./conto
mese odierno (mm):
5
Runtime error 106 at 0x08052B67
  0x08052B67
  0x08053041
  0x080480B0
[claudio@luna mio-programma]$
---------------------------------------
sotto windows XP (TP7) mi dice che non trova il file, ma i files
nomemese.txt ci sono tutti
 (anche se inizialmente vuoti) !!
perchè mi dà questo errore ? perchè non mi permette di aggiungere dati
?
grazie per l'attenzione.
claudio
P.S.: questo è il mio programma
 program conto;
 type   TipoNodo = record
                     bene : string[30];
                     data : integer;
                     ammontare : real;
		     commento : string;
		  end;
	TipoListaConto = ^TipoRecordListaConto;
	TipoRecordListaConto = record
					info : TipoNodo;
					next : TipoListaConto;
				  end;
	TipoStringa = string[20];
	TipoStringa1 = string[12];
 var
  risposta : char;
  lista : TipoListaConto;
  R : TipoNodo;
  nomefile : string[10];
  mese : integer;
procedure LeggiLista(var lis : TipoListaConto; nomefile : string);
  var datafile : text; paux : TipoListaConto; R : TipoNodo;
begin
assign(datafile, nomefile);
reset(datafile);
new(paux);
paux^.next := lis;
lis := paux;
while not eof(datafile) do
 begin
  with R do
   readln(datafile, bene, data, ammontare, commento);
  new(paux^.next);
  paux := paux^.next;
  paux^.info := R;
 end;
 paux := lis;
 lis := paux^.next;
 dispose(paux);
end;
  procedure InserisciTestaLista(var lis : TipoListaConto; elem :
TipoNodo);
   begin
   if lis = NIL then
    begin
     new(lis);
     lis^.info := elem;
     lis^.next := NIL;
    end;
   end;  (*InserisciTestaLista*)
  procedure InserisciCodaLista(var lis : TipoListaConto; elem :
TipoNodo );
   var ultimo, paux : TipoListaConto;
   begin
    new(paux);
    paux^.info := elem;
    paux^.next := NIL;
    if lis = NIL then
     lis := paux
    else
     begin
      ultimo := lis;
      while ultimo^.next <> NIL do
       ultimo := ultimo^.next;
      ultimo^.next := paux;
     end;
   end;  (*InserisciCodaLista*)
  procedure ScriviLista(nomefile : string; lis : TipoListaConto);
   var datafile : text;
  begin
   assign(datafile, nomefile);
   rewrite(datafile);
(*scrittura della lista*)
   while lis <> NIL do
    begin
     with lis^.info do
     writeln(datafile, bene, '  ', data, '  ', ammontare:4:2, '  ',
commento);
     lis := lis^.next;
    end;
    close(datafile);
   end;   (*ScriviElemento*)
 begin
   writeln('mese odierno (mm):');
   readln(mese);
   case mese of
    1 : nomefile := 'gennaio.txt';
    2 : nomefile := 'febbraio.txt';
    3 : nomefile := 'marzo.txt';
    4 : nomefile := 'aprile.txt';
    5 : nomefile := 'maggio.txt';
    6 : nomefile := 'giugno.txt';
    7 : nomefile := 'luglio.txt';
    8 : nomefile := 'agosto.txt';
    9 : nomefile := 'settembre.txt';
    10 : nomefile := 'ottobre.txt';
    11 : nomefile := 'novembre.txt';
    12 : nomefile := 'dicembre.txt';
  end;
  LeggiLista(lista,nomefile);
(*  with R do *)
(*    begin*)
(*     bene := '     bene        ';*)
 (*    data := 'data   ';*)
(*     ammontare := 'ammontare in EURO';*)
 (*    commento := '                commento';*)
 (*   end;*)
 (* InserisciTestaLista(lista,R);*)
  risposta := 'S';
  while (risposta = 'S') or (risposta = 's') do
   begin
    writeln('digita cosa hai comprato : ');
    readln(R.bene);
    writeln('quanto hai speso (in EURO) ? ');
    readln(R.ammontare);
    writeln('che giorno e'' stato (gg) ? ');
    readln(R.data);
    writeln('Eventuale commento : ');
    readln(R.commento);
    InserisciCodaLista(lista, R);
    writeln('vuoi inserire un altro record (S/N)? ');
    readln(risposta);
   end;
   ScriviLista(nomefile, lista);
  writeln('la lista e'' stata salvata nel file ', nomefile, '.' );
 end.

Non ho guardato il codice, comunque il RTE 106 salta fuori quando con
una Read tenti di mettere in un integer o real un formato numerico
scorretto (banalmente 1,5 ti segnalerebbe errore, per la virgola
anziche' il punto decimale). Possibili cause: (i) dopo che il
programma l'ha salvato modifichi in qualche modo il file nomemese.txt;
(ii) fai leggere al programma una riga di nomemese.txt che tu credi
sia un numero invece e' una stringa, controlla e semmai aggiungi
qualche Read "a vuoto".
-- 
Omega e' omega e basta

[...]
forse ho trovato la soluzione, ma ho bisogno di un vostro aiutino.
il programma 'conto' deve ricevere in input i campi di un record R
bene : string[10];
data : integer;
ammontare : real;
commento : string;
e poi li scrive in un file di testo.
Il mio problema alla seconda esecuzione del programma ottenenvo un
Runtime error 106.
Adesso ho capito perchรจ : la parola corrispondente al campo 'bene'
non veniva scritta con
10 caratteri e quindi poteva capitare che nella lettura del file di
testo
non + vuoto (II esecuzione del progr.) il campo bene e quello data
fossero considerati un campo solo
con evidenti incompatibilitร  conseguenti.
la mia domanda รจ :
vorrei che in output il campo bene fosse sempre lungo 10 caratteri e
quindi se la parola รจ piรน piccola di
10 caratteri il progr. deve aggiungere gli spazi rimanenti.
Se questo non accade, ottengo sempre l'errore 106 di cui sopra.
Come dovrei modificare il codice a tal proposito ?
grazie mille :)
claudio

Come dovrei modificare il codice a tal proposito ?
if Length(R.bene)<10 then
  for i:=Lenght(R.bene)+1 to 10 do R.bene[i]:=' ';
R.bene[0]:=Chr(10);
Cmq non mi sembra tanto necessario, la cosa importante e' che nel file
ogni campo stia su una riga separata, al limite anche vuota, quindi
usa sempre WriteLn() e non Write().
