Newsgroup: it.comp.lang.c
Titolo: file

mi dite come fare a leggere in un file il carattere che si trova alla
posizione IDX.
vi prego aiutatemi!
-- 
---
Saluti,
Antonello PINNELLA
"Se un uomo non č disposto a correre qualche rischio per le sue idee,
o le sue idee non valgono nulla o non vale niente lui."
EZRA POUND (1885 - 1972)

 posizione IDX.
Apri il file. Leggi IDX - 1 caratteri scartandoli. Il prossimo che 
leggerai sara` quello che cerchi.

 vi prego aiutatemi!
FILE * fp;
char c;
..
fseek( fp, IDX, SEEK_SET );
c = fgetc( fp );
..
la funzione fseek() ti permette di spostare il cursore interno del file
nella posizione che vuoi. Leggi come funziona.
Ciao
Matic

 nella posizione che vuoi. Leggi come funziona.
Sapevo che qualcuno avrebbe risposto cosi` (e anche io l'avrei fatto 
fino a poco tempo fa). Ma mio malgrado ho scoperto che lo standard *non* 
garantisce il funzionamento di questa soluzione per i file di testo, ma 
solo per i file binari.
Recita il C99 (per il C89 sto provvedendo a informarmi):
        7.19.9.2  The fseek function
        Synopsis
        [#1]
                #include <stdio.h>
                int fseek(FILE *stream, long int offset, int whence);
        Description
        [...]
        [#4]  For  a  text  stream,  either offset shall be zero, or
        offset shall be a value returned by  an  earlier  successful
        call  to  the ftell function on a stream associated with the
        same file and whence shall be SEEK_SET.
E il risultato della chiamata ad ftell non e` detto che rappresenti 
l'offset in byte, infatti:
        7.19.9.4  The ftell function
        Synopsis
        [#1]
                #include <stdio.h>
                long int ftell(FILE *stream);
        Description
        [#2] The ftell function obtains the  current  value  of  the
        file position indicator for the stream pointed to by stream.
        For a binary stream, the value is the number  of  characters
        from the beginning of the file.  For a text stream, its file
        position indicator contains unspecified information,  usable
        by  the  fseek  function  for  returning  the  file position
        indicator for the stream to its position at the time of  the
        ftell call; the difference between two such return values is
        not necessarily  a  meaningful  measure  of  the  number  of
        characters written or read.
Una soluzione potrebbe essere quella di aprire anche il file di testo in 
modo binario, ma in questo modo (ad esempio) sotto Windows il carattere 
'\n' verrebbe percepito come due caratteri distinti. Questo potrebbe 
essere un problema (oppure no) a seconda delle situazioni. E 
probabilmente esistono anche altri problemi di portabilita` a me ignoti.
Mi sa tanto che l'unica maniera standard e portabile di risolvere il 
problema con un file di testo e` di contare un carattere alla volta. Se 
avete altre idee proponete...

 avete altre idee proponete...
Really interesting - ero completamente all'oscuro di questo fatto.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

 int c; /* altrimenti non puoi controllare che sia EOF */
E' vero che va usato 'int' perché il prototipo della funzione (fgetc()) 
dice che ritorna un 'int', ma è anche vero che anche se è char il 
controllo (c == EOF) lo puoi fare lo stesso. Erro ?
Mi domandavo anche perché (solo curiosità) venga usato un int e non un 
char nel prototipo della fgetc(). Qualcuno lo sa ?
per il resto ottima argomentazione, non ne ero a conoscenza.
Ciao
Matic

 controllo (c == EOF) lo puoi fare lo stesso. Erro ?
Erri.
fgetc può ritornare un carattere (quindi uno fra 256 differenti valori) 
oppure un EOF: quindi un totale di 257 valori.
Se fosse char (ibve ceh int) avresti a disposizione solamente 256 valori 
e quindi potresti confondere un EOF con un carattere legittimo.
Di solito EOF vale -1
e i caratteri ritornati sono invece compresi tra 0 e 256.
- Dario

 fgetc puň ritornare un carattere (quindi uno fra 256 differenti valori) 
...supponendo che i char siano di 8 bit.

 
WOW
verissimo! non c'avevo mai pensato. Grazie della delucidazione
Ciaouz

 Recita il C99 (per il C89 sto provvedendo a informarmi):
[cut]
Confermo che quanto riportato in seguito vale anche per il C89 (le 
parole usate nella bozza dello standard sono esattamente le stesse).