Page 1 sur 1

Pointeur interne de fichier, et position gauche et droite.

Posté : 28 avr. 2008, 19:33
par Hywan
Hey :),

Ça fait longtemps que j'ai pas ouvert un sujet tiens.
Je me remettais un peu sur les pointeurs de fichier en PHP (les positions à partir de laquelle PHP doit écrire). Pour mémoire, on parle avec les constantes SEEK_CUR, SEEK_END, et SEEK_SET, respectivement pour la position courante, la position de fin du fichier, et la position définie via la variable whence. Enfin bref, je vais pas refaire un cours hein, je m'adresse à ceux qui savent ;-).

Donc voilà. Une fois que l'on a une position pour le pointeur, on peut aussi parler de position par rapport aux caractères. Soit on est à droite du caractère, soit on est gauche du caractère (notion très forte dans vi par exemple : commande a ou i ?). Et dans PHP, ça m'a l'air d'être gérer comme un patate. Exemple :
$fp = fopen('fichier', 'rb');
// On remet le pointeur au début, même s'il l'est par défaut.
fseek($fp, 0, SEEK_SET);

// On lit le premier caractère.
echo fread($fp, 1);
Donc ici, on est position gauche, et on lit de 1 vers la droite. Donc on a sélectionné le premier caractère. Et on se retrouve en position gauche du second caractère.

Maintenant, on essaye ceci :
// On se place à la fin du fichier.
fseek($fp, 0, SEEK_END);

// Et on lit un caractère.
echo fread($fp, 1);
Ne marchera pas. Pourquoi ? Car cette fois, fseek s'est mis en position droite. Si on veut lire le dernier caractère, il faut faire :
fseek($fp, -1, SEEK_END);
echo fread($fp, 1);
On pourrait penser que c'est logique, mais en fait pas du tout. Et c'est encore moins rigoureux. Dans le premier exemple, on est en position gauche du caractère :

Code : Tout sélectionner

|Notre fichier.
Dans le seconde exemple, on est en position droite :

Code : Tout sélectionner

Notre fichier.|
Dans le dernier exemple, on est en position droite :

Code : Tout sélectionner

Notre fichier|.
Alors que dans le second exemple on devrait être en position gauche :

Code : Tout sélectionner

Notre fichier|.
La seule explication que j'ai trouvé est qu'il se place sur le caractère de fin de fichier, et donc il serait en effet à gauche du caractère, mais ce serait un peu bête là ...
Si quelqu'un a compris ma question, est-ce qu'il peut m'expliquer ce comportement étrange ?

D'après mes souvenirs, ce comportement est le même en C, ce qu'il me laisse penser qu'il travaille avec le caractère de fin de fichier (EOL). Il a quelle forme déjà ?

Merci :).

Posté : 28 avr. 2008, 21:11
par x@v
dans vim l'option
-A

Code : Tout sélectionner

-A Si Vim a été compilé avec le support de la fonctionnalité ARABIC pour l’édition de fichiers de droite à gauche et les claviers arabes, cette option lance Vim en mode Arabe, c.-à-d. que l’option ’arabic’ est activée. Sinon, un mes‐ sage d’erreur est émis et Vim quitte.
permet d'écrire à l'envers comme les arabes
pour -i

Code : Tout sélectionner

-i {viminfo} Lorsque l’utilisation d’un fichier viminfo est activée, cette option indique le nom de fichier à utiliser à la place de "~/.viminfo" par défaut. Il est possible d’empêcher l’utilisation d’un fichier ".viminfo", en spécifiant le nom de fichier "NONE".
Tiens sa programme avec vi (le méchant programme) !
je troll, je sais je suis méchant, méa culpa

Posté : 28 avr. 2008, 21:17
par Hywan
Aucun rapport avec mon sujet. Je connais évidemment les commandes a et i, j'utilise vim tous les jours ... Relis les questions.
Je donnais l'exemple de a et i pour les insertions à droite et à gauche d'un caractère.
Edit : et je parlais des commandes pas des paramètres de la commande ...

Posté : 29 avr. 2008, 10:16
par Truc
Dans le dernier exemple le pointeur est en position gauche...
Et pour le second je dirais qu'il est en position gauche par rapport au "pointeur" de fin de fichier :)

Posté : 29 avr. 2008, 15:04
par Hywan
Dans le dernier exemple le pointeur est en position gauche...
Et pour le second je dirais qu'il est en position gauche par rapport au "pointeur" de fin de fichier :)
Pour le dernier exemple, il est en position droite car on est en -1. Il serait à gauche si on était à 0 (le tout par rapport à SEEK_END).
Donc tu penses comme moi pour le second, il est à gauche par rapport à la fin, donc ce serait par rapport au caractère de fin de fichier (EOL), non ?