Newsgroup: it.comp.lang.pascal
Titolo: Aiuto

Scusatemi se vengo qui solo per chiedere il vostro aiuto ma mi devo 
preparare con parecchia urgenza un lavoro in Pascal e nn so a chi chiedere.
Ho un file .txt che contiene solo dei numeri separati da spazio e vorrei 
prendere questi numeri e metterli in 3 variabili diverse da utilizzare nel 
programma.
Ho fatto questa procedura ma da un problema sulla lettura del file. A parte 
quello avete qualche consiglio da darmi?
program prova1;
uses crt;
var f:text;
     s,ss,sss:string;
    a,i:integer;
    r1,r2,r3:real;
procedure leggi;
  Begin
    assign(f,'lusio.txt');
    reset(f);
    read(f,s);
    a:=length(s);
    val(s,r1,i);
    ss:=copy(s,i+1,a);
    val(ss,r2,i);
    sss:=copy(ss,i+1,a);
    val(sss,r3,i);
  end;
-- 
LuSio 

Innanzi tutto usa readln e non read sui file di testo altrimenti non 
passa alla linea successiva.
Poi come sono messi i valori? Tutti su di una linea? Su più linee?
Sono delimitati da un singolo carattere spazio?
Vediamo un po'.... se il file è cosi' composto
v1 v2 v3
v4 v5 v6
eccetera puoi usare
ReadLn(F, S);  {letto l'intera linea}
S1 := Copy(S, 1, Pos(' ', S)-1);  {prendo il primo valore}
Delete(S, 1, Pos(' ', S); {Cancello il valore letto più lo spazio}
S2 := Copy(S, 1, Pos(' ', S)-1);  {prendo il secondo valore}
Delete(S, 1, Pos(' ', S); {Cancello il valore letto più lo spazio}
S3 := S; {Quello che rimane è il terzo valore}
{Ora converto i valori da stringa ad intero}
Val(S1, R1, I);
Val(S2, R2, I);
Val(S3, R3, I);
Questo è valido se prima del primo valore non ci sono caratteri strani, 
dopo l'ultimo valore non ci sono caratteri strani e tra un valore ed un 
altro c'e' solo uno spazio.
Se magari sei più preciso sul formato....
Ciao,
David

Innanzitutto grazie dell'aiuto.
Il file è formato da un unica linea e da numeri separati da uno spazio. Ma 
nn so ogni numero di quante cifre può essere formato, se ha o meno la 
virgola.
Quindi il file può essere
12 256 1258,6
oppure
1 0 -1 5896331
quindi nn so le posizione da copiare. Nel mio programma ho sfruttato 
l'errore del val per ripartire a copiare ma nn sono riuscito a provarlo 
perchè, pur compilandolo senza errori, nn riesco a farlo andare, da problemi 
sulla gestione del file. Mi sai dire perchè, se è giusto quello che ho 
scritto?
-- 
LuSio 

Immagina di avere -1.2 123
a:=length(s);
//ritorna 8
val(s,r1,i);
//errore ed i ritorna 5
ss:=copy(s,i+1,a);
//SS sarà '123' ti sei perso il primo numero
// in teoria dovevi usare ss:=copy(s,1,i-1) per il primo numero e quella 
tua per il resto della stringa
Una nota la funzione COPY vuole la stringa di partenza, la posizione del 
primo carattere ed il numero di caratteri da copiare quindi la dicitura
copy(s,i+1,a) è sbagliata a priori in quanto a non dovrebbe essere la 
lunghezza della stringa ma il numero di caratteri da copiare (in questo 
caso a-i)
Ciao,
David

 copiare (in questo caso a-i)
Se il numero dei caratteri da copiare supera i caratteri rimanenti, allora 
copia fino alla fine. Per nn mettere un numero arbitrario come 100, ho messo 
la lunghezza di tutto che sicuramente è piu lungo della sottosringa.
-- 
LuSio
Città di Palermo (544828),
3°  in  VII.73   Stagione 24
1°  in  VII.73   Stagione 25
3°  in  VI.303  Stagione 26 

 la lunghezza di tutto che sicuramente è piu lungo della sottosringa.
Certo che lo puoi fare ma è poco pulito. Specie se vuoi passare a varie 
versioni di pascal (non solo Borland) oppure convertire il sorgente in 
altri linguaggi.
Ciao

program prova1;
uses crt;
var f:text;
     s,ss,sss:string;
    a,i:integer;
    r1,r2,r3:real;
procedure leggi;
  Begin
    assign(f,'lusio.txt');
    reset(f);
    readln(f,s);
    a:=length(s);
    val(s,r1,i);
    if i=0 then
       begin
          ss:=copy(s,0,i-1);
          val(ss,r1,i);
       end;
    val(ss,r2,i);
    if i=0 then
       begin
          ss:=copy(ss,0,i-1);
          val(ss,r2,i);
       end;
    val(ss,r3,i);
    if i=0 then
       begin
          ss:=copy(s,0,i-1);
          val(ss,r3,i);
       end;
end;
-- 
LuSio 

Scusa volevo dire diverso nn uguale negli if...
-- 
LuSio 

( LuSio - news:43cf9b83$0$1081$
4faf...@reader3.news.tin.it
 )
mi viene un dubbio... sai che read puo' leggere direttamente un numero?
var
 f: text;
 i: real;
...
while not(eof(f)) do
 begin
  read(f, i);
  writeln(i);
 end;
non dimenticarti mai di chiudere il file in fondo :)
 close(f);
-- 
Dreadnaut - 
http://dreadnaut.servebeer.com/
(Life would be easier if I had the source code)

 close(f);
Ok Grazie


Il mio TP7 mi da errore di runtime.
Ho cercato un po' e ho visto che riguarda l'uso del crt o la velocità della 
cpu.
Ho scaricato la patch ma nn riesco ad installarla. Non posso provare i 
programmi...
-- 
LuSio 

 Ok Grazie
finche' leggi e' un problema relativo, ma se te ne dimentichi quando 
scrivi su file, puo' accadere che non salvi.


Un Grazie infinito a tutti quanti.
Spero che queste informazioni mi siano utili alle olimpiadi di informatica 
sezione regionale di oggi...
^_^
-- 
LuSio