Ecrire dans un fichier texte a un endrois précis

Eléphanteau du PHP | 10 Messages

25 mars 2006, 19:09

Bonjour,

je voudrais ajouter du texte au milieu d'un texte deja existant, cependant, le texte que j'y ajoute écrase la suite du texte de base.

j'arrive a placer le curseur au bon endrois mais la suite est écrasée par le nouveau texte.

Ma question est : comment faire pour que la suite du texte ne soit pas écrasée?
MSO

Invité
Invité n'ayant pas de compte PHPfrance

26 mars 2006, 13:26

tu récupère la partie écrasé avant qu'elle ne le soit écrit ton texte supplémentaire puis réecri la partie qui a été récupéré :lol:

Eléphant du PHP | 451 Messages

26 mars 2006, 20:56

Je vois 2 solutions :
Soit tu veux rajouter 1 ou plusieurs lignes dans ton fichier,
dans ce cas, le mieux (a mon avis) est de copier le fichier en le suffixant tmp
puis tu ouvres le fichier tmp en lecture et le fichier d'origine en écriture
tu lis le fichier tmp lignes par lignes et tu ecris les lignes dans le fichier d'origine jusqu'à ce que tu doives rajouter des lignes
tu écris tes lignes à rajouter,
puis tu continues à lire les lignes du fichier tmp pour écrire les lignes restantes.

Autrement, si, ton fichier n'est pas en mode lignes,
tu te positionnes à l'endroit où tu dois insérer avec fseek
tu lis le reste du fichier pour le mémoriser dans une variable ou le copier dans un fichier temporaire si c'est trop gros.
tu te repositionnes avec fseek
tu écris ce que tu dois ajouter
tu écris ce que tu as sauvegardé à la suite

tu fermes les fichiers et tu efface le fichier tmp si tu en as créé un.

Si ça ne sufiit pas, précises dans quel cas tu es (mode ligne ou non) je tenterai de te donner un exemple....

Bon courage :)
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphanteau du PHP | 10 Messages

28 mars 2006, 21:58

Pour détailler un peut plus mon système, voici comment je travail pour l'instant.

1* un formulaire qui récupère le nom, ainsi que le contenu de la nouvelle page a créer.

2* vérification que les champs ont bien ete remplis, ensuite la page est créer (avec vérification que la page existe bel et bien). Ensuite, un autre formulaire demande dans quel menu (gauche ou droite) l'utilisateur souhaite créer la page (pas encore mis au point).

3*Derniere page, celle ci récupere les variables nécessaires a l'écriture d'une ligne de code, visant a ajouter dans une page de fonction, le lien vers la page nouvelement créé.

Si je souhaite ajouter uniquement une seule page, aucun souci.
Le probleme apparait lorsque je tente d'ajouter une deuxieme page, car le code correspondant au lien de la deuxième page écrase celui de la premiere, ce qui entraine des bugs de codages dans la page de fonction.

J'espere avoir mieux détailler mon probleme.

Merci de votre réponse. J'attend la suivant avec bcp d'impatience.
MSO

Eléphant du PHP | 451 Messages

28 mars 2006, 22:11

Je ne comprends rien a ton explication... :roll:

La seule chose que je peux dire, c'est que pour ouvrir un fichier, il faut avoir son nom.
Si le code de la deuxième page écrase celui de la première c'est soit :
  • que le nom du fichier correspond àà celui de la deuxième
    que je n'ai rien compris du tout
Je penche pour la 2eme hyppothèse :oops:

Autrement, pour ajouter à la fin d'un fichier, il faut l'ouvrir avec A+
$fp= fopen("fichier_a_ouvrir", "a+");
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphanteau du PHP | 10 Messages

28 mars 2006, 22:20

En effet je crois qu'on c'est pas compris.

Les fichiers sont bien fermer a chaque fois et les noms ne sont pas les memes, voici directement le code de la page 2 et une partie de la 3.
Page 2:

Code : Tout sélectionner

<?php $titre = $_POST['fonction']; $tst = 'case "'.$titre.'": return ("modules/'.$titre.'.php"); break;'; $chemin = "includes/fonctions.php"; $fonction = fopen($chemin, 'r+'); $lire = readfile ($chemin); $seek = fseek ($fonction, 1981); $ecrire = fputs($fonction, $tst); fclose ($fonction); echo $lire; ?>
page 3:

Code : Tout sélectionner

function sitemap($name) { switch($name) { case "test": return ("modules/test.php"); break; case "404": return ("modules/404.php"); break; case "denied": return ("modules/denied.php"); break; default: return ("modules/1.php"); break; case "download": return ("modules/download.php"); break; case "ultima": return ("modules/ultima.php"); break; case "screens": return ("modules/screenshots.php"); break; case "develop": return ("modules/develop.php"); break; case "status": return ("modules/404.php"); break; case "equipe": return ("modules/equipe.php"); break; case "communaute": return ("modules/communaute.php"); break; case "monde": return ("modules/hist_monde.php"); break; case "balance": return ("modules/m_balance.php"); break; case "bouclier": return ("modules/m_bouclier.php"); break; case "denier": return ("modules/m_denier.php"); break; case "grimoire": return ("modules/m_grimoire.php"); break; case "sceptre": return ("modules/m_sceptre.php"); break; case "presentation": return ("modules/presentation.php"); break; case "reglement": return ("modules/reglement.php"); break; case "admin": return ("modules/admin.php"); break; case "rediger": return ("modules/rediger.php"); break; case "infos": return ("modules/infos.php"); break; case "statistique": return ("modules/stat.php"); break; case "apercu": return ("modules/apercu.php"); break; case "supprimer": return ("modules/supprimer.php"); break; case "roleplay": return ("modules/roleplay.php"); break; //ici s'integre par la page nouvellement crée,mais écrase la suite. } }
MSO

Eléphant du PHP | 451 Messages

29 mars 2006, 07:19

Décidément, je ne comprends rien de rien !!!
Voici un petit bout de code qui écrit quelques lignes puis en rajoute.

Première solution (en mode ligne à ligne) :
<?php
r// debut écriture de quelques lignes dans un fichier 
$fp=fopen("fictest.txt", "w");
fwrite($fp,"ligne 1\n");
fwrite($fp,"ligne 2\n");
fwrite($fp,"ligne 3\n");
fwrite($fp,"ligne 7\n");
fwrite($fp,"ligne 8\n");
fwrite($fp,"ligne 9\n");
fclose($fp);
// relecture et affichage
$fp=fopen("fictest.txt", "r");
while(!feof($fp)) {
	$ligne_lue=fgets($fp,1024);
	echo "<BR>".$ligne_lue;
}
fclose($fp);
// He mais il manque les lignes 4, 5, 6 !!!
echo "<HR>Mince manque des lignes !!!<BR>On va les rajouter...<HR>";
// On va les ajouter...
// 1) on commence par renommer le fichier
rename("fictest.txt", "fictest_incomplet.txt");
// 2) on ouvre le fichier incomplet en lecture et un nouveau fichier en ecriture
$fp1=fopen("fictest_incomplet.txt", "r");
$fp2=fopen("fictest.txt", "w");
// on on relit tout en verifiant où on en est
while(!feof($fp1)) {
	$ligne_lue=fgets($fp1,1024);
	fwrite($fp2,$ligne_lue);
	if (trim($ligne_lue) == "ligne 3") {
		// il faut rajouter lignes 4, 5 et 6
		fwrite($fp2,"ligne 4\n");
		fwrite($fp2,"ligne 5\n");
		fwrite($fp2,"ligne 6\n");
	}
}

fclose($fp1);
fclose($fp2);
// relecture et affichage
$fp=fopen("fictest.txt", "r");
while(!feof($fp)) {
	$ligne_lue=fgets($fp,1024);
	echo "<BR>".$ligne_lue;
}
fclose($fp);
unlink("fictest_incomplet.txt");

?>
Et voici l'autre solution (avec fseek) :
<?php
// debut écriture de quelques lignes dans un fichier 
$fp=fopen("fictest.txt", "w");
fwrite($fp,"ligne 1\n");
fwrite($fp,"ligne 2\n");
fwrite($fp,"ligne 3\n");
fwrite($fp,"ligne 7\n");
fwrite($fp,"ligne 8\n");
fwrite($fp,"ligne 9\n");
fclose($fp);
// relecture et affichage
$fp=fopen("fictest.txt", "r");
while(!feof($fp)) {
	$ligne_lue=fgets($fp,1024);
	echo "<BR>".$ligne_lue;
}
fclose($fp);
// He mais il manque les lignes 4, 5, 6 !!!
echo "<HR>Mince manque des lignes !!!<BR>On va les rajouter...<HR>";
// On va les ajouter...
// 1) on commence par renommer le fichier
copy("fictest.txt", "fictest_incomplet.txt");
// 2) on ouvre le fichier incomplet en lecture et un nouveau fichier en ecriture
$fp1=fopen("fictest_incomplet.txt", "r");
$fp2=fopen("fictest.txt", "r+");
$seek1 = fseek ($fp1, 24); 
$seek2 = fseek ($fp2, 24); 
// on rajoute nos lignes en priant pour que la valeur de seek soit la bonne...
fwrite($fp2,"ligne 4\n");
fwrite($fp2,"ligne 5\n");
fwrite($fp2,"ligne 6\n");
// on on lit la suite pour et on ecrit la fin
while(!feof($fp1)) {
	$ligne_lue=fgets($fp1,1024);
	fwrite($fp2,$ligne_lue);
}

fclose($fp1);
fclose($fp2);
// relecture et affichage
$fp=fopen("fictest.txt", "r");
while(!feof($fp)) {
	$ligne_lue=fgets($fp,1024);
	echo "<BR>".$ligne_lue;
}
fclose($fp);
unlink("fictest_incomplet.txt");

?>
j'espère que ça pourra t'aider...
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Mammouth du PHP | 19672 Messages

29 mars 2006, 09:25

Schématiquement : tu dois stocker le contenu du fichier original dans un tableau indexé qu'on appellera tableauA : ensuite, tu recrées un second tableau qu'on appellera tableauB : tu y ajoutes d'abord les premières lignes de tableauA jusqu'au point d'insertion de l'ajout, puis tu ajoutes les lignes à insérer et enfin tu rajoutes les dernières lignes de tableauA. Enfin, tu recrées le fichier à partir de tableauB.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

29 mars 2006, 17:35

Je m'en vais teste cela dès que mon stage seras terminer car la le temps me manque, merci bcp j'ai quand meme bcp avancer grâce à vous,je vous ferais savoir quand j'aurais terminer
MSO

Eléphanteau du PHP | 10 Messages

30 mars 2006, 21:17

J'ai réussi grâce à vous a écrire dans l'ordre prévu l'ensemble de mon texte,

le souci c'est que maintenant je souhaite réunir en un seul fichier les trois qui ont été écrit voici le code qui permet de créer les fichiers.
<?php
$titre = $_POST['fonction'];
$tst = 'case "'.$titre.'":
		return ("modules/'.$titre.'.php");
	break;';


		$chemin_fct = "fct.txt";
		$fct = fopen($chemin_fct, 'r');
		$lire_fct = readfile($chemin_fct);
		fclose ($fct);
				
				$chemin_tmp = "fct_ch.txt";
				$tmp = fopen($chemin_tmp, 'a+');
				fputs ($tmp, $tst);
				$lire_tmp = readfile($chemin_tmp);
				fclose ($tmp);
		
		$chemin_fct2 = "fct2.txt";
		$fct2 = fopen($chemin_fct2, 'r');
		$lire_fct2 = readfile($chemin_fct2);
		fclose ($fct2);
						
?>
voici 3 fichiers que je souhaite placer dans un 4ème.

Merci d'avance.
MSO

Eléphant du PHP | 451 Messages

31 mars 2006, 00:17

Où est le problème ?
  • tu crées un nouveau fichier (le 4eme) en l'ouvrant en écriture,
    tu ouvres en lecture celui que tu veux placer au début,
    tu le lis et tu l'ecris dans le fichier ouvert en écriture,
    tu fermes le fichier que tu viens de lire,
    tu ouvres en lecture celui que tu veux mettre en deuxième,
    tu le lis et tu l'ecris dans le fichier ouvert en écriture,
    tu fermes le fichier que tu viens de lire,
    tu ouvres en lecture celui que tu veux mettre en dernier,
    tu le lis et tu l'ecris dans le fichier ouvert en écriture,
    tu fermes le fichier que tu viens de lire,
    tu fermes le fichier que tu viens d'écrire,
    éventuellement tu supprime les fichiers que tu as concaténés.
Et le tour est joué non ? 8)


Tu peux même te passer de la copie du premier en ouvrant celui-ci en écriture sans l'effacer et en positionnant le curseur en fin de fichier. Il te suffit allors d'y ecrire les deux autres dans l'ordre que tu désires. Et éventuellement de renommer si nécessaire ;)
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphanteau du PHP | 10 Messages

31 mars 2006, 17:29

hé hé question de logique :lol:

merci je vais enfin pouvoir mettre tout ca en place.
MSO