Oppure

Loading
17/09/10 21:06
systemgvp
salve,

supponiamo che abbia creato un comune file TXT dal contenuto di una matrice numerica, distanziando i valori con "#9".

la mia domanda ora è questa:
ricaricando questo file in un oggetto TMemo, come posso reinserirlo nella matrice?

es. file
10.3 1.08 22.0 36.6
10.2 32.1 25.3 25.0
10.3 1.08 22.0 36.6
10.2 32.1 25.3 25.0
aaa
17/09/10 21:53
Poggi Marco
Per riconoscere un numero, basta fare la conversione da stringa a tipo numerico.
Per suddividere i valori, basta considerare il carattere divisore (#9).

Il mio consiglio è quello di non utilizzare i file di testo per questo genere di lavoro.
Ultima modifica effettuata da Poggi Marco 17/09/10 21:54
aaa
18/09/10 13:48
systemgvp
e cosa dovrei usare?

per me sono i più comodi visto che sono una delle poche cose "universali" che leggono tutti i pc e i sistemi operativi.

Il mio problema è che finora ero costretto a mettere i valori in singole riche per ciascun valore.

mi potresti postare un pezzo di codice per il problema a cui mi hai risposto?
aaa
18/09/10 18:54
Poggi Marco
Una valida alternativa ai file di testo sono i file binari.
Con essi è possibile "formattare" i dati come si vuole, accedere direttamente ad una determinata posizione del file e modificare i campi nel file.

Posto due funzioni per i file testueli; una in grado di scrivere e l' altra di leggere numeri su file di testo.

In scrittura:
procedure scrivi(var g:text); // in g ho un riferimento ad un file aperto
  var n:double;
  begin
    writeln('Scrttura di valori su file di testo');
    writeln('Inserire in valore negativo per terminare');
    repeat
      write('Numero -> ');
      readln(n);
      if n>0 then  writeln(g, n); // utilizzo il carattere invio come divisore
    until n<0;
  end; 


in lettura:
procedure leggi(var g:text); // in g ho un riferimento ad un file aperto
  var n:double;
  num:string;
begin
   writeln;
   writeln('Lettura del file di testo:');
   writeln;
   reset(g); // mi posiziono all' inizio del file
   while not eof(g) do
   begin
    readln(g, num);
    delete(num, 1, 1); // elimino il primo carattere
    n:=StrToFloat(num);
    writeln(n:8:3);
   end;
end;
Ultima modifica effettuata da Poggi Marco 18/09/10 18:55
aaa
19/09/10 12:27
systemgvp
la tua soluzione non va, mi da errore nel tipo di variabile "Text", ma siccome a me serviva qualcosa non da console ma attraverso un TMemo ho optato per:

var matrice : array of array of real; numero:string;
    i,j,jj:integer;
begin
  //dimensioni matrice
  SetLength(matrice,3,3);
  //lettura dati
  for I := 0 to memo1.Lines.Capacity - 1 do
  begin
    //azzera le variabili
    j:=0;
    numero:='';
    //gira la riga contenente i numeri
    for jj := 1 to Length(memo1.Lines[i]) do
    begin
      //se trova un distanziatore TAB
      if (memo1.Lines[i][jj]=#9)  then
      begin
        //prende il numero
        Matrice[i,j]:=StrToCurr(numero);
        //incrementa la posizione
        j:=j+1;
        //pulisce il numero
        numero:='';
      end  //aggiunge una cifra al numero
      else numero:=numero+memo1.Lines[i][jj];
      //per l'ultimo valore
      if (jj=Length(memo1.Lines[i])) then Matrice[i,j]:=StrToCurr(numero);
    end;
  end;
end;

aaa