Newsgroup: it.comp.lang.pascal
Titolo: File di tipo testo

Salve a tutti!
Qualcuno mi può spiegare a che servono i file di tipo testo e in quali
applicazioni vengono usate.
Ho già letto il tutorial sul sito di ReDiCuori ma non capito quando si
usano.
Vi chiedo questo perchè ho creato un programmino dove come dati di input
inserisco una serie di numeri.
Questi numeri vengono fuori da un programma che lavora sotto windows i quali
possono essere copiati (copia-incolla) in un file di testo per esempio del
blocco note.
A questo punto vi chiedo se è possibile creare in pascal un file di tipo
testo ( da inserire nel programma)
che contenga i numeri
di input del mio programma.
Non so se mi sono spiegato bene.
Grazie.

 ha scritto nel messaggio
news:8UgV9.8194$ZE.2...@twister2.libero.it...



prova sul sito in firma, ho cominciato a trattare questo argomento da poco
-- 
Ciao
Marchese Gianfranco
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi in privato) sito internet personale:
www.turbo-pascal.cjb.net
  Tutto sul Turbo Pascal  1.5

 ha scritto nel messaggio
news:b0698a$mfl$1...@le.cs.unibo.it...


     reset(test);
Tu in questa riga dici al compilatore di aprire il file di teto in sola
lettura, mentre poi, con write(test,x) dici di scrivere una linea nel
file...
il programma giusto è il seguente
Program testo;
var
test:text;
x:string;
begin
    assign(test,'C:\documenti\numeri.txt');
while not eof do begin
    reset(test);
    readln(test,x);
    writeln(x);
end;
    close(test);
end.
vado di fretta quindi spero di non aver sbagliato nulla... confermate voi
grandi saggi del ng =)

 numero del file di testo?
No ! Qui dobbiamo iniziare dall' ABC....
Prima di tutto stampante, video, tastiera e se non erro tutte le periferiche
a carattere sono considerati dei file di testo !
Ora quando usiamo readln(x) oppure read(x) per leggere dati dalla tastiera e
writeln(x) o write(x) per scrivere i dati sul video non facciamo altro che
utilizzare una versione ridotta delle 4 funzioni !
Readln e read nella versione estesa sono  readln(var f , var x)
dove f è un file e x una variabile... idem read, writeln, write
ora quando non usiamo questa versione estesa il compilatore sa che vogliamo
leggere o scrivere dagli standard input e output
prova a scrivere readln(input,x) e vedi da dove si aspetta i dati....
o priva a scrivere writeln(output,'ciao');
La variabile x indica quale è la variabile che deve contenere i dati letti
scrivere readln(test,2) non ha senso ed il compilatore ti deve dare errore
in fase di compilazione (ALT+F9)
Ciao RdC
--
L'informatica è un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal
sorgenti, tutorial ed utility
---------------------------------------------------------

Grazie RDC per gli aiuti e per la lezione di storia;d'ora in poi non
sbaglierò più sulla lunghezza dei nomi dei file.
Ora però ho bisogno ancora di un aiutino.
Il file di testo ' numeri.txt ' contiene una serie di numeri (disposti su
una colonna ) ed ho la necessità di inserirli in un array ( di tipo real )
in modo tale da essere più facilmente maneggiati.
Grazie.
"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:5u_V9.62494$AA2.2...@news2.tin.it...


 Grazie.
il file numeri.txt è di questo tipo ?
12.23
12.33
0.003
0.123
etc
etc
Beh ! potresti fare una cosa che mi hanno detto in questi giorni, ma non
credo funzioni
var f : text;
      r  : array[1..10] of  real;
      i: integer;
begin
    assign(f,'numeri.txt');
    reset(f);
    i:=1;
    while not eof(f) do
         begin
             readln(f,r[i]);
             i:=i+1;
         end;
end.
Ma sono un pò dubbioso sul funzionameto.
Cmq se non funzionasse (99% che ti dia qualche errore !) puoi prendere la
funzione strtoreal che è presente
nel tutorial le stringhe nel sito in firma
var f : text;
     r : array[1..10] of real;
    s : string;
    i: integer;
begin
    i:=1;
   assign(f,'numeri.txt');
   reset(f);
   while not eof(f) do
       begin
           readln(f,s);
           r[i]:=strtoreal(s);
          i:=i+1;
       end;
end.
Un piccolo appunto ... quanto grande dimesioni l'array ? e se poi ci sono
più righe nel file ? Forse è meglio se usi una lista !


Non ho trovato la function strtorial nel sezione tutorial "le stringhe".
Cmq il programma che mi hai consigliato mi dà qualche errore come avevi
immaginato.
Accetto sempre consigli per risolvere il problema.
Grazie.
"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:d8WW9.77008$AA2.3...@news2.tin.it...


 Grazie.
Il tutorial c'è la funzione è valreal ed è l'ultima del tutorial !
il link diretto è
http://utenti.lycos.it/pascallike/tutorial/stringhe/str.html


Ciao RDC,
ho riportato qui sotto il programma con le function che mi hai consigliato.
Quando lo lancio mi dà errore "," expected sulla riga vett[i]:=Valreal(s);
(precisamente mi mette il cursore sulla seconda parendesi tonda).
Come si risolve il problema?
Grazie.
Program testo;
uses crt;
type vettore=array[1..10] of real;
var
i:integer;
vett:vettore;
test:text;
s:string;
function chrINstr(s : string; c : char) : integer;
        var pos : integer;
        begin
          pos:=1;
          while (pos<=ord(s[0])) and (s[pos]<>c) do
            pos:=pos+1;
          if pos>ord(s[0]) then
            chrINstr:=0
          else
            chrINstr:=pos;
       end;
function strextract(s : string; start, n : integer) : string;
     var s2 : string;
         i : integer;
     begin
       s2:='';
       if (start>0) and (start<length(s)) then
         if (n>0) then
           begin
             if (n > ord(s[0])) then
               n:=ord(s[0])-start+1;
             for i:=0 to N-1 do
               s2:=s2+s[start+i];
          end;
       strExtract:=s2;
    end;
function ValReal(s: string; var err : integer) : real;
          var r,molt : real;
              intero, decimale : string;
              sep,i : integer;
           begin
            r:=0;
            err:=0;
            (* cerchiamo il punto *)
            sep:=chrinstr(s,'.');
            if sep>0 then
              begin
                intero:=strextract(s,1,sep-1);
                decimale:=strextract(s,sep+1,length(s)-length(intero)-1);
              end
            else
              begin
                intero:=s;
                decimale:='';
             end;
            (* Conversione della parte intera *)
            molt:=1;
            i:=length(intero);
            while(i>=1)and(err=0) do
              begin
                if (intero[i]<'0') and (intero[i]>'9') then
                  err:=i
                else
                  begin
                    r:=r+(ord(intero[i])-48)*molt;
                    i:=i-1;
                    molt:=molt*10;
                 end;
             end;
            (* Conversione della parte decimale *)
            i:=1;
            molt:=10;
            while(i<=length(decimale)) and (err=0) do
              begin
                if (decimale[i]<'0') and (decimale[i]>'9') then
                  err:=i
                else
                  begin
                    r:=r+(ord(decimale[i])-48)/molt;
                    i:=i+1;
                    molt:=molt*10;
                 end;
             end;
            ValReal:=r;
         end;
begin
    clrscr;
    assign(test,'C:\docume~1\momenti.txt');
    reset(test);
    i:=1;
    while not eof(test) do begin
        readln(test,s);
        vett[i]:=Valreal(s);
        i:=i+1;
        writeln(s);
    end;
    close(test);
 repeat until keypressed;
end.
"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:rRdX9.60387$0v.18...@news1.tin.it...


 function ValReal(s: string; var err : integer) : real;
la funzione vuole due parametri
tu la invochi vett[i]:=Valreal(s);
con un solo parametro
Ciao ReDiCuori


Ora funziona alla grande!!!!
Però c'è un altro piccolo problema cioè la function ValReal non riconosce i
numeri negativi.
Su una colonna del file di testo posso avere sia numeri reali positivi che
negativi.
C'è un rimedio?
Perdonami se ti scoccio così tanto ma grazie a te sto capendo molte cose.
Ciao.
"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:4uDX9.67240$0v.20...@news1.tin.it...


 Perdonami se ti scoccio così tanto ma grazie a te sto capendo molte cose.
Non è una scocciatura, ma sarebbe meglio che la soluzione la trovi tu poi se
non funzione posti quello che
hai fatto, in modo da raggionarci sopra
Cmq
una soluzione che mi viene ora alle 22.03 dopo tante tante ore sul libro di
algebra è questa...
penso si possa fare molto meglio.
function ValReal(s: string; var err : integer) : real;
          var r,molt : real;
              intero, decimale : string;
              sep,i : integer;
           begin
            r:=0;
            err:=0;
            (* cerchiamo il punto *)
            sep:=chrinstr(s,'.');
            if sep>0 then
              begin
                intero:=strextract(s,1,sep-1);
                decimale:=strextract(s,sep+1,length(s)-length(intero)-1);
              end
            else
              begin
                intero:=s;
                decimale:='';
             end;
            (* Conversione della parte intera *)
            molt:=1;
            i:=length(intero);
            sep:=1;
            while(i>=1)and(err=0) do
              begin
                if (intero[i]<'0') and (intero[i]>'9') then
                  begin
                       if (intero[i]='-') and (i=1) then
                          begin
                              err:=0 ; sep:=-1;
                          end
                       else  err:=i
                  end;
                else
                  begin
                    r:=r+(ord(intero[i])-48)*molt;
                    i:=i-1;
                    molt:=molt*10;
                 end;
             end;
            (* Conversione della parte decimale *)
            i:=1;
            molt:=10;
            while(i<=length(decimale)) and (err=0) do
              begin
                if (decimale[i]<'0') and (decimale[i]>'9') then
                  err:=i
                else
                  begin
                    r:=r+(ord(decimale[i])-48)/molt;
                    i:=i+1;
                    molt:=molt*10;
                 end;
             end;
            ValReal:=r * sep;
         end;


Ciao RDC,
grazie ancora per il tuo aiuto.
Il codice che mi hai scritto ha un errore cioč "Error in statement"  sulla
riga dove si trova "else" (credo del primo IF ) nella parte di codice
(*Conversione della parte intera*).
Ho cercato di risolverlo ma non ci sono riuscito anche perchč non conosco il
significato di " end else ".
Perdonami l'ignoranza.
Grazie.


 Ho cercato di risolverlo ma non ci sono riuscito anche perchè non conosco


Avevo già provato ma niente.
Ciao.
"ReDiCuori" <redicu...@NOSPAMinwind.it> ha scritto nel messaggio
news:MWhY9.106186$AA2.4...@news2.tin.it...


 > >                     r:=r+(ord(intero[i])-48)*molt;
L'errore sta nel end prima dell'else non deve esserci il ";"
scusami se te lo dico ma questa è una cosa da 5 elementare
Ciao ReDiCuori


Ciao RDC.
La function che mi hai scritto riconosce i numeri negativi ma non sono
uguali a quelli presenti nel file numeri.txt.
Qui sotto c'e il programma;inserisci 10 numeri negativi reali nel file
numeri.txt che devi creare nella cartella documenti.
Grazie.
Program prova;
uses crt;
type vettore=array[1..10] of real;
var
vett,num:vettore;
i,err:integer;
s:string;
test:text;





function ValReal(s: string; var err : integer) : real;




                    end else err:=i
                   end
                else begin
                    r:=r+(ord(intero[i])-48)*molt;
                    i:=i-1;
                    molt:=molt*10;
                end;
            end;
            (* Conversione della parte decimale *)
            i:=1;
            molt:=10;
            while(i<=length(decimale)) and (err=0) do
              begin
                if (decimale[i]<'0') and (decimale[i]>'9') then
                  err:=i
                else
                  begin
                    r:=r+(ord(decimale[i])-48)/molt;
                    i:=i+1;
                    molt:=molt*10;
                end;
            end;
            ValReal:=r*sep;
end;
begin
         clrscr;
         assign(test,'C:\docume~1\numeri.txt');
         reset(test);
         i:=1;
         while not eof(test) do begin
            readln(test,s);
            num[i]:=Valreal(s,err);
            i:=i+1;
         end;
         close(test);
         for i:=1 to 10 do begin
             gotoxy(1,i);write(num[i]:0:3);
         end;
         repeat until keypressed;
end.

 end.
non ho seguito il thread... ma prima che RdC ti uccida e/o mutili di parti
importanti... sei sicuro di quel write con :0:3 ?
A occhio (a km da un compilatore) ottieni solo tre cifre decimali e zero
intere, quindi potrebbe essere il motivo per cui ti viene sbagliato.
Credo. poi non so'... cmq sostituirei il ciclo con un
for i := 1 to 10 do
 writeln (  num[i] );
o al massimo se si puo' mettici un "::3" se vuoi solo tre cifre dec invece
della notazione sciiiiientifica.
saluti,
Dreadnaut
-- 
Signless perche' in trasferta

 ha scritto nel messaggio
news:dad40748.03012...@posting.google.com...


 testo. Ciao.
che dire... correggila, il sorgente e' li.
E per favore 'quota' un pochetto :-)
-- 
Dreadnaut
(Life would be easier if I had the source code)