Newsgroup: it.comp.lang.pascal
Titolo: cursore in file testo

Se io ho un programma che deve prendere in input dei dati da un file
di testo come lo sposto il cursore all'interno di questo file.txt ?
Avevo pensato all'istruzione gotoxy ma questa mi sposta il cursore
solo nella videata di output.
Grazie per l'aiuto.
______________________________
e-mail:  
Aur...@hotmail.com
ICQ:     16005054

solo nella videata di output.
Pensare di spostare il "cursore" all'interno di un file di testo e' a
dir poco "folle" ;)
Il cursore ha senso solo se riferito al video.
In realta', il puntatore del file viene spostato automaticamente nel
file man mano che leggi.


Allora se per esempio ho un file di testo cosě strutturato:
peppe
pippo
pluto
e voglio assegnare questi tre nomi a tre variabili nome1,nome2,nome3
come posso fare?
CIAOoooo....


come posso fare?
var F : text ;
begin
  assign ( F, "miofile.txt" ) ;
  reset ( F ) ;
  readln ( F, nome1 ) ;
  readln ( F, nome2 ) ;
  readln ( F, nome3 ) ;
  close ( F ) ;
end.


Ma cosi' nella stringa nome1 oltre alle lettere p e p p e ci vanno
anche tutti gli spazi che compongono la prima riga del file di testo?
Se il file,invece,fosse cosi' strutturato:
pippi calze lunghe
pippo
pluto
come faccio a mettere "pippi" in nome1   pippo in nome2  e pluto in
nome3 ?
Magari utilizzando un :
while not eof(testo) do
  while not eoln(testo)do.......


nome3 ?
program prova;
var f : text ;
    nome1, nome2, nome3 : string ;
    procedure tronca( var s : string ) ;
    var i : integer ;
    begin
      if pos( ' ', s ) > 0 then
      begin
        i := 1 ;
        while ( s[i] <> ' ' ) do
              inc( i ) ;
        s[0] := chr( i - 1 ) ;
      end ;
    end ;
begin
   assign( f, 'topolino.txt' ) ;
   rewrite( f ) ;
   writeln(f, 'pippi calze lunghe' ) ;
   writeln(f, 'pippo' ) ;
   writeln(f, 'pluto' ) ;
   close( f ) ;
   reset( f ) ;
   readln(f, nome1 ) ; tronca( nome1 ) ;
   readln(f, nome2 ) ; tronca( nome2 ) ;
   readln(f, nome3 ) ; tronca( nome3 ) ;
   close( f ) ;
   writeln( nome1 ) ;
   writeln( nome2 ) ;
   writeln( nome3 ) ;
end.

    end ;
Grazie.
Questo programma mi e' stato davvero molto utile.
Ho solo un piccolo dubbio.Cosa significa questa riga:
  if pos( ' ', s ) > 0 then
Cosa fa "pos"  ?


Cosa fa "pos"  ?
"pos( s, t )" e' una funzione che restituisce l'indice della prima
occorrenza di s in t.
Nel caso specifico, restituisce l'indice del primo spazio in s.
Dato che pos, se non trova la sottostringa cercata, restituisce 0,
l'espressione  "if pos ( s, t ) = 0" equivale a "se non hai trovato s
dentro t ...".

Prendendo spunto dai tuoi insegnamenti ho provato a fare un programma
che dato un file testo.txt cosi' strutturato:
Mario Rossi
mette in una variabile nome la stringa "Mario" e in una cognome mette
"Rossi".
Pero' ho incontrato una cosa che mi ha lasciato perplesso.
ecco il prog:
program gigetto (testo,output);
uses crt;
var temp,nome,cognome:string;
    i,j:integer;
    testo:text;
 function carattere (car:char):boolean;
  begin
     if (car>='a')and(car<='z')or(car>='A')and(car<='Z')
     then carattere:=true
     else carattere:=false;
  end;
begin
   clrscr;
   assign(testo,'testo.txt');
   reset(testo);
   readln(testo,temp);
   nome:=temp;
   nome[0]:=chr(5);
   i:=1;
   while carattere(temp[i]) do
    begin
       temp[i]:=' ';
       inc(i);
    end;
    inc(i);
    j:=1;
   while carattere(temp[i]) do
    begin
       cognome[j]:=temp[i];
       inc(i);
       inc(j);
    end;
    write(nome,'  ');
    writeln(cognome);
    readln;
end.
Allora,se lascio il programma cosi' com'è non funziona.Utilizzando
Watch vedo che nella variabile cognome non ci viene copiato nessun
carattere di temp.Se invece dichiarassi la variabile cognome non di
tipo string ma di tipo array[1..?]of char  funzionerebbe normalmente.
Mi sapresti dire perche' ?
Grazie.


Allora,se lascio il programma cosi' com'è non funziona.
Il programma, cosi' com'e', non puo' funzionare, per il semplice
motivo che cognome non viene inizializzato a nessuna lunghezza
specifica.
Sulla mia macchina, difatti, dopo "Rossi" vengono stampati dei
caratteri incomprensibili.
Non e' buona norma, se si vogliono inserire dei caratteri in una
stringa, andarli a scrivere in modo diretto per mezzo degli operatori
[], ma e' bene addizionarli alla stringa stessa.
Il motivo e' chiaro : con l'addizione viene automaticamente
incrementato il primo valore (stringa[0]), mentre con la scrittura
diretta no.
Cioe', per farti un esempio pratico, supponendo di voler mettere dei
valori dentro s definita come stringa io scriverei :
Operazione implicita          equivalente a 
------------------------------------------------
s := '' ;                     s[0] = chr( 0 ) ;
s := s + 'M' ;                s[0] = chr( 1 ) ;
                              s[1] = 'M' ;
s := s + 'a' ;                s[0] = chr( 2 ) ;
                              s[2] = 'a' ;
s := s + 'r' ;                s[0] = chr( 3 ) ;
                              s[3] = 'r' ;
....                          ....
Il programma corretto, nel tuo caso, e' il seguente :
program Auran ;
uses crt ;
var temp    : string ;
    nome    : string ;
    cognome : string ;
    i, j    : integer;
    testo   : text ;
    function carattere( c : char ) : boolean ;
    begin
      carattere := c in ['A'..'Z','a'..'z'] ;
    end ;
begin
   clrscr ;
   assign( testo, 'testo.txt' ) ;
   reset ( testo ) ;
   readln( testo, temp ) ;
   nome := '' ;
   cognome := '' ;
   i := 1 ;
   while ( carattere( temp[i] ) ) do
   begin
     nome := nome + temp[i] ;
     inc( i ) ;
   end ;
   inc( i ) ;
   while ( carattere( temp[i] ) and
           ( i <= length( temp ) ) ) do
   begin
     cognome := cognome + temp[i] ;
     inc( i ) ;
   end ;
   writeln( nome ) ;
   writeln( cognome ) ;
end.