OVH Cloud OVH Cloud

Ecriture dans un fichier

3 réponses
Avatar
SK Lurk
Bonjour,

Je voudrais modifier quelques octets à l'intérieur d'un fichier binaire. Le
problème, c'est que je dois faire cette opération sur un grand nombre de
fichiers (plusieurs milliers) et que chaque fichier fait plus de 10Mo. Avec
ma méthode actuelle (lecture du fichier en mémoire, modif des octets en
mémoire, réécriture du fichier), c'est très long car chaque fichier est lu
et réécrit en totalité.
Existe-t-il une possibilité pour ouvrir le fichier, déplacer le pointeur,
écrire un octet et fermer le fichier ?
Un truc du genre :
- fopen()
- fseek()
- fwrite()
- fclose()
Tous les modes d'ouverture de fopen() sont soit en lecture seule, soit
tronque le fichier en taille 0, etc...

Merci

3 réponses

Avatar
Olivier Miakinen

Tous les modes d'ouverture de fopen() sont soit en lecture seule, soit
tronque le fichier en taille 0, etc...


Relis mieux <http://fr2.php.net/manual/fr/function.fopen.php> :

'r+' Ouvre en lecture et écriture, et place le pointeur de fichier
au début du fichier.

'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la
fin du fichier. Si le fichier n'existe pas, on tente de le créer.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
SK Lurk
'r+' Ouvre en lecture et écriture, et place le pointeur de fichier
au début du fichier.

'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la
fin du fichier. Si le fichier n'existe pas, on tente de le créer.


Je vais re-essayer avec r+, mais a+ ne fonctionne pas :
http://fr2.php.net/manual/fr/function.fseek.php
il est bien précisé que les données sont écrites à la fin du fichier, sans
possibilité de déplacer le pointeur.

Avatar
Marc
ce script fonctionne bien chez moi.


<?php

error_reporting(E_ALL);

$file='test.txt';
$mode1 = 'a+';
$mode2 = 'r+';

if(file_exists($file))
unlink($file);

# ----------- creation du fichier -----------------------
$fp = fopen($file, $mode1);
if($fp == NULL){
echo "erreur creation fichier $filen";
exit(1);
}

fwrite($fp, 'abcdefghijklmnopqrstuvwxyz' . "n");
fclose($fp);

# ----------- modification du fichier --------------------

$fp = fopen($file, $mode2);
if($fp == NULL){
echo "erreur lecture-ecriture fichier $filen";
exit(1);
}


# le 6ieme caractere est remplacé par un X
$status = fseek($fp, 5, SEEK_SET);
if($status != 0){
echo "erreur fseekn";
exit(1);
}

fwrite($fp, 'X');

# le 16ieme caractere est remplacé par un Y
$status = fseek($fp, 15, SEEK_SET);
if($status != 0){
echo "erreur fseekn";
exit(1);
}

fwrite($fp, 'Y');
fclose($fp);

?>