Aller au contenu

Placement du pointeur et éditer le fichier...


Sujets conseillés

Posté

Salut à toutes et à tous.

J'en appel à votre savoir pour un bête problème...que mes recherches n'ont pas résolu.

Je voudrais ajouter à un endroit précis d'un fichier "news.xml" du texte par exemple contenu dans $data. Seulement je n'arrive pas à placer précisément le pointeur à la fin de la sixième ligne et à trouver comment ajouter le texte sans supprimer ce qui suit...j'ai pourtant passé deux heures à chercher sans résultat :'(.

Merci d'avance à tous ceux qui répondront ;)

Posté

Il n'existe pas à ma connaissance de possibilité d'insérer du texte en plein milieu d'un fichier, il faut que tu récupères tout ton fichier, que tu le modifies, et que tu l'écrases.

Tu peux utiliser pour cela la fonction file() de PHP, qui te retournera un tableau de ton fichier, chaque entrée correspondant à une ligne.

A partir de là, il te sera aisé d'ajouter des lignes où bon te semble, puis d'écraser le fichier en utilisant les données du tableau modifié.

Posté (modifié)

Bonjour à toi,

C'est bien ce que je pensais...seulement j'ai déjà essayé également, alors je dois mal m'y prendre :P

En fait, il me faudrait récupérer tout ce qui dans le fichier, se situe après la ligne 6 (donc à partir de la ligne 7...)... Je connais le contenu jusqu'à la ligne 6, il ne changera pas, je pourrais ainsi former le nouveau contenu en ajoutant le contenu qui ne change pas + le nouveau contenu + la suite du fichier précédemment récupérée.

Seulement j'ai eu beau essayer...je n'ai pas réussi... un petit indice ? :P

Modifié par Troll
Posté

Il te suffit tout simplement de récupérer le contenu de ton fichier dans un array avec la fonction file(), puis d'effectuer six fois un array_shift() pour supprimer les 6 premières lignes.

Il ne te restera plus qu'à recréer ton fichier, avec les six premières lignes connues, puis ton ajout, puis l'array ainsi obtenu, ligne par ligne.

Posté

Hum... donc ça ? :

$farray = file('fichier.xml');
for($i = 0; $i <=6; $i++)
{
$farray = array_shift($farray);
}
$content_add = 'contenu a ajouter';
$content = 'contenudessixpremièreslignes'.$content_add.implode("", $farray);

$fh = fopen('fichier.xml', "w");
fwrite($fh, $content);

C'est bien ça ?

Posté

Il faudrait sans doute que tu crées tes lignes en ajoutant un retour chariot à chaque fois, sinon tu ne pourras plus refaire la manipulation.

Et sinon, ta boucle for a 7 incrémentations (de 0 à 6); fais-là aller de 1 à 6, ou de 0 à 5 ;) (ou change tout simplement le <= en < strict).

Posté

Ok pour la boucle, par contre je ne sais pas ce que c'est que le "retour chariot", je me demandais justement ce qu'il fallait mettre pour le retour à la ligne... =) \f ? \n ? \t ?

Merci bien =)

Posté (modifié)

Hum...j'ai un joli :

"Warning: array_shift() [function.array-shift]: The argument should be an array in *****.php on line 5"

La ligne 5 c'est la ligne $farray = file('news.xml');

Qu'est-ce qui ne va pas là ? O_o

edit : J'ai aussi essayé comme ca :

$f = fopen('news.xml', "r");

while(!feof($f)) { $farray[] = fgets($f); }
fclose($f);

A la place de file(), mais rien n'y change, on dirait qu'il ne reconnait pas que le fichier est sur plusieurs lignes... :-/

Modifié par Troll
Posté (modifié)

J'avais déjà essayé avec print_r, qui ne trouvait rien dans les 8 premières clés, et qui trouvait le tiers du texte du fichier...

Voilà avec var_dump :

array(8) { [0]=> string(40) " " [1]=> string(21) " " [2]=> string(11) " " [3]=> string(27) " " [4]=> string(41) &quot;http://www.pcinfo-web.com/ " [5]=> string(125) "Communauté et entraide informatique, news informatique et multimédia, tutoriaux... " [6]=> string(12) " " [7]=> string(6) "" }

Je dois avouer que je n'arrive pas à piger le problème là :-/

(à noter : les chiffres entre parenthèses dans string(xx) changent selon où le fichier à ouvrir est situé j'ai remarqué... )

Pour info, voilà le contenu du fichier :

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>PcInfo-Web</title>
<link>http://www.pcinfo-web.com/</link>
<description>Communauté et entraide informatique, news informatique et multimédia, tutoriaux...</description>
</channel>
</rss>

Modifié par Troll
Posté

Plus personne n'a d'idée ?

En regardant le code source de la page en fait je me rends compte que l'array contient bien ce qu'il faut, les guillemets ne contiennent rien car les balises font disparaitre le texte, le code source donne, lui :

array(8) {
[0]=>
string(40) "<?xml version="1.0" encoding="utf-8"?>
"
[1]=>
string(21) "<rss version="2.0">
"
[2]=>
string(11) "<channel>
"
[3]=>
string(27) "<title>PcInfo-Web</title>
"
[4]=>
string(41) "<link>http://www.pcinfo-web.com/</link>
"
[5]=>
string(125) "<description>Communauté et entraide informatique, news informatique et multimédia, tutoriaux...</description>

"
[6]=>
string(12) "</channel>
"
[7]=>
string(6) "</rss>"
}

Donc l'array est bien un array, il contien bien ce qu'il faut...pourquoi ce warning ?!

Posté (modifié)

Le code n'avait pas changé... :)

Mais en fait j'ai trouvé d'où venait le bug, en effet array_shift retourne le contenu du premier élément du tableau, en plus de le raccourcir, donc en fait à la fin de la première boucle, $farray n'était plus un tableau.

D'autres bugs sont venus s'ajouter ensuite mais j'ai résolu ça. Je vous donne le code fini, avec des notes pour ceux qui liront :

<?

//On récupère le fichier sous forme de tableau
$farray = file("rss/news.xml");

// On supprime les 6 premières lignes
for($i = 1; $i <=6; $i++)
{
$useless = array_shift($farray);
}

// On défini un contenu à ajouter
$content_add = "<item>
<title> Est-ce au bonne endroit ?</title>
<description> Bon bah premier test hein...</description>
</item>\n";

// On définit le contenu des 6 premières lignes que l'on a supprimé
$six_first = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<rss version=\"2.0\">
<channel>
<title>PcInfo-Web</title>
<link>http://www.pcinfo-web.com/</link>
<description>Communauté et entraide informatique, news informatique et multimédia, tutoriaux...</description>\n";

// ON additionne sixpremiereslignes+contenu à ajouter+contenu après les 6 premieres lignes
$content = $six_first.$content_add.implode($farray);

//On écrase le ficheir avec le nouveau contenu
$fh = fopen("rss/news.xml", "w+");
fwrite($fh, $content);
fclose($fh);
echo 'Effectué';
?>

Voilà, j'espère que ça servira à quelqu'un :)

Ah aussi en passant : file() inclut déjà le retour à la ligne, donc si dans implode() on définit un retour comme séparateur des éléments du tableau, ca fait deux lignes :)

Et aussi : quand on fait un retour à la ligne entre guillemets pour le contenu du variable, php le prends en compte, pas besoin de mettre "\n" =)

Voili voilou =) Merci de t'être penché sur mon problème captain torche(pour ne pas dire flamme c'est ça ? =P ) ;)

A bientot peut-être =)

Modifié par Troll

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...