Ecrire dans un fichier à une ligne spécifique

Bonjour,

Je recherche actuellement un code php me permettant d’écrire dans un fichier distant (sur ftp) et à une ligne spécifique.

J’ai réussi à afficher le fichier avec fopen() mais déjà le fichier s’affiche sur une ligne (pourtant dans le code source de la page, c’est parfait).
J’ai aussi réussi à écrire dans le fichier (au début ou à la fin) avec les fonctions fseek() et fputs().

Si ça peut vous aider, la ligne en question est composée de cette manière :

texte “emplacement d’écriture

Il y a donc un texte d’amorce, puis un espace, et le texte qui doit être écrit se trouve entre guillemets.

Pourriez-vous m’aider s’il vous plait ?

Merci bien,
Blue.

Tu as plusieurs choix :

  1. avec file() tu peux ouvrir le fichier sous forme de tableaux de ligne, ce que je te conseille pour la rapidité mais ce que je déconseille si le fichier est gros (faut en plus le charger puisque sur FTP)
  2. tu as fgets() qui te permettra de lire le fichier ligne par ligne.

Pour rechercher ton texte, j’irai pas par quatre chemins : tu as un masque fixe, donc tu peux faire un truc dans ce genre (pour chaque ligne $line)

$texte = ‘texte "’;
if (strncmp($texte, $line, strlen($texte)==0) {
// faire un truc
}

Et sinon l’habituelle regexp :

if (preg_match(’/^texte “(.*)”$/’, $line, $match)) {…}

Bref, tu as les armes. A toi de voir comment t’en servir
Edité le 07/08/2007 à 09:45

Bonjour “Sans-Nom”, (ça fait bizarre de dire ça ^^)

En fait, si j’ai bien compris ton code, tu fais rechercher la ligne qui contient le masque devant les " ".

Mais après, le pointeur se situe où ? En début de ligne ou après le premier " ?

Parce qu’en fait, je pense que je n’ai pas bien détailler dans mon premier post. Après le masque, entre les guillemets, ça contient déjà du texte qui doit être remplacé par celui envoyé.

Tu comprend le soucis ? ^^

Merci bien,
Blue.

fgets lit toute la ligne, donc à priori ton curseur est après cette ligne. Tu peux néanmoins faire un ftell() avant de lire la ligne, ou après avoir lue la ligne précédente.

Je viens d’essayer de lister le contenu en numérotant les lignes :

<?php
// Lit une page web dans un tableau.
$lines = file ('config.php');

// Affiche toutes les lignes du tableau comme code HTML, avec les numéros de ligne
foreach ($lines as $line_num => $line) {
    echo 'Ligne No <strong>' . $line_num . '</strong> : ' . htmlspecialchars($line) . '<br />'."\n";
}

// Un autre exemple, pour obtenir une page web dans une chaîne. Voir aussi la fonction file_get_contents().
$html = implode ('', file ('config.php'));
?>

Donc là je vois bien le contenu ainsi que le numero de chaque ligne. Mais je ne comprend toujours pas comment dire au pointeur de se mettre au début de la ligne n° 6 et de la remplacer par celle envoyée.

Aurais-tu un exemple concret s’il te plait ? (je suis désolé, j’ai un peu de mal des fois sans exemple)
Edité le 07/08/2007 à 14:49

ben

$lines = file (‘config.php’);
$lines[5] = ‘nouvelle ligne 5’,
file_puts_content(‘config.php’, implode(’’, $lines));

je sais pas moi :slight_smile:

merci, ton code avait une petite erreur (3 eme ligne, il faut remplacer la virgule par un :wink: et sinon, il me sort cette erreur :

Call to undefined function: file_puts_content()

Tu vois où est le problème ?

cf doc php. C’est file_put_contents je pense.

Ah je viens de comprendre, c’est une fonction php5 et le serveur sur lequel je suis ne l’a pas :s

Bon j’ai reussi à faire fonctionner le file_put_contents :wink:

Il suffisait de créer un .htaccess pour activer le php5.

Cependant, le code que tu m’as donné rajoute bien à la ligne souhaité le code. Par contre, il supprime la ligne du dessous. Donc si on actualise pleins de fois, on se retrouve au bout d’un moment avec pour dernière ligne, la ligne 5 ^^