Newsgroup: it.comp.www.php
Titolo: fscanf

Salve.
Non sono un grande esperto di php (anzi...). Sto cercando
di fare porting in php, di un software (in C) scritto da altri.
 Il mio probema è la funzione fscanf, che sembra funzionare
in modo diverso in php rispetto al C (anche
uno dei commenti presenti su un manuale online recita
"For C/C++ programmers.
fscanf() does not work like C/C++, because PHP's fscanf() move file
pointer the next line implicitly." [che magari se lo leggevo subito
evitavo di stare  un pomeriggio a fare prove per capirlo da solo] )
Questa cosa mi crea piu' di un problema.
Volevo chiedere se esiste una qualche funzione che abbia lo
stesso comportamento della fscanf del C (in altre parole una funzione
identica alla fscanf ma che *non* muova implicitamente il file pointer
alla linea successiva [non so a priori quante stringhe contiene una singola
linea del file 
e ho bisogno di qualcosa del tipo seguente (riduco qui ai minimi
termini il codice C che devo portare in php):
$ cat a.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
 int done;
 done=0;
 char token[256];
 FILE *f=fopen("prova1.txt","r");
 if(f==NULL)
 {
   printf("error opening file prova1.txt");
   exit(0);
 }
 while(!done)
 {
   /* fetch next token */
   token[255] = '

T posso aiutare, mandami mail contatto

 T posso aiutare, mandami mail contatto
La email che compare nei miei post
e' valida. Comunque penso che potrebbe interessare anche
ad altri
Ciao,
Marco.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

    token[255] = '
Mi sono accorto solo ora che il codice nel
post precedente era incompleto:


    token[255] = '
Chiedo scusa, pare che sia proprio newsland che lo taglia. Va beh...
Ciao,
Marco


 linea del file
Ciao Marco.
abituati a pensare diversamente dal C: php è loosely typed, non sapere
quante stringhe ci sono in una riga del file non è un problema. Puoi
tranquillamente scorrere il file riga per riga con una fgets(),
sbattere il risultato in una variabile buffer di lunghezza ignota, e
tokenizzare quella, invece che tokenizzare direttamente da file con la
scanf, facendolo 255 caratteri per volta, o usando caratteri di
separazione (in tal caso dai un'occhiata alla explode()), o come vuoi.
L'unico rischio è che non ci sia un line break prima di incocciare il
memory limit del PHP; in tal caso sospetto sia un file binario, ed è
meglio usare la fread().
bye!

 Marco
appunto per quello ti chiedevo mail, cmq pastebin mai mi raccomando


appunto che tecnicamente bisognerebbe ovviare rimanendo piu' simili al
C, magari per questioni di performance etc.. cmq senza il caso
specifico difficile dirlo.. explode dovresti mettere il file su una
sola riga/variabile altrimenti bisognerebbe fare ulteriori
controlli ,.. dipende da x fattori

 controlli ,.. dipende da x fattori
...EH?
bye!

Hermooz ha scritto:


Ciao,
scusa se rispondo in ritardo, ma questa e' una attivita' che faccio
"a tempo perso" per cui non e' una cosa che faccio con continuita'.
Nel caso in esame comunque il problema era che stavo tentando
di fare il porting in php di una software scritta in C. Questo
software legge da un file di testo contenente delle partite di scacchi
e le rielabora generando pagine html contenenti javascript mediante
le quali si possono appunto rendere visibili le partite sul web.
Il mio problema era che in C, quando si andavano a leggere
le mosse di una singola partita, veniva eseguito un algoritmo del
tipo:
<pseudocodice>
 while(sto_elaborando_le_mosse_di_una_partita)
 {
   fscanf(f,"%s",&buffer[0]); //leggi una stringa
   if(la_stringa_letta_e'_una_mossa_della_partita)
   {
     //elabora la mossa
   }
   else
   {
     //fai altre cose (tipo break se ti accorgi che la partita e' finita)
   }
 }  
 
</pseudocodice>
 
Nel tentativo di fare un porting il piu' rapidamente possibile
avevo tentato di utilizzare la stessa fscanf pensando che funzionasse
come in C.
Poi pero' mi sono accorto che la fscanf del php va alla linea successiva;
tra l'altro me ne sono accorto perche' la prima mossa veniva 
elaborata bene, mentre dopo la prima mossa, ovvero alla seconda
iterazione del ciclo appunto mancavano diverse mosse.
Mi spiego meglio:
Un file di partite di scacchi ha la seguente forma 
( riporto un paio di partite):
[Event "European time, fast games #44"]
[Site "
http://gameknot.com/chess.pl?bd=5479173
"]
[Date "2006.08.01"]
[Round "-"]
[White "geppoz"]
[Black "gm_paz"]
[Result "1-0"]
[WhiteElo "1419"]
[BlackElo "1559"]
[TimeControl "259200+86400"]
[Mode "ICS"]
[Termination "normal"]
1. e4 e5 2. Bc4 c6 3. f4 exf4 4. Nf3 Nf6 5. O-O d5 
6. exd5 Nxd5 7. d4 Bg4 8. Bxd5 Qxd5 9. Bxf4 Bd6 10. Re1+ Be7 
11. Nc3 Qd7 12. Qd3 Bf5 13. Qe3 Bxc2 14. Ne5 Qe6 15. Na4 Bxa4 
16. Qg3 O-O 17. Ng4 Qd7 18. Kh1 Re8 19. Bh6 Qxd4 20. Bg5 f6 
21. Rxe7 Rxe7 22. Bxf6 gxf6 23. Nh6+ Kf8 24. Qg8#  1-0
[Event "European time, fast games #44"]
[Site "
http://gameknot.com/chess.pl?bd=5511770
"]
[Date "2006.08.04"]
[Round "-"]
[White "geppoz"]
[Black "manbehind"]
[Result "1-0"]
[WhiteElo "1370"]
[BlackElo "1478"]
[TimeControl "259200+86400"]
[Mode "ICS"]
[Termination "time forfeit"]
1. e4 e5 2. Bc4 c6 3. f4 exf4 4. Nf3 Nf6 5. O-O d5 
6. exd5 Nxd5 7. d4 g5 8. Ne5  1-0
Dall'elaborazione vedevo che magari per la prima partita veniva
elaborata bene tutto fino alla stringa "1." (l'elaborazione delle
prime righe, quelle che iniziano con '[' consiste semplicemente
nell'andare a leggere la riga successiva) 
e poi l'elaborazione passava alla stringa "6.". Ovvero
si saltava tutta la parte "e4 e5 2. Bc4 c6 3. f4 exf4 4. Nf3 Nf6 5. O-O d5"
e si andava direttamente alla riga successiva...
per ora ho risolto tenendo traccia della dimensione
della stringa che leggo e tenendo traccia
dell'offset di inizio e fine della stringa e 
spostandomi nel file con fseek, poi magari
(quando avro' risolto altri problemi)  cerchero' qualcosa di
meglio.
