web-dev-qa-db-fra.com

file_put_contents, file_append et sauts de ligne

J'écris un script PHP qui ajoute des nombres dans un fichier texte. Je veux avoir un numéro sur chaque ligne, comme ceci:

1
5
8
12

Si j'utilise file_put_contents($filename, $commentnumber, FILE_APPEND), le résultat ressemble à:

15812

Si j'ajoute un saut de ligne comme file_put_contents($filename, $commentnumber . "\n", FILE_APPEND), des espaces sont ajoutés après chaque numéro et une ligne vide à la fin (le trait de soulignement représente les espaces):

1_
5_
8_
12_
_
_

Comment puis-je obtenir cette fonction pour ajouter les chiffres comme je le souhaite, sans espaces?

32
user426965

Avez-vous essayé avec PHP constante EOL?


file_put_contents($filename, $commentnumber . PHP_EOL, FILE_APPEND)

--- Ajoutée ---

Je viens de réaliser que mon éditeur de fichiers fait de même, mais ne vous inquiétez pas, c'est juste un personnage fantôme que l'éditeur place là pour signaler qu'il y a une nouvelle ligne Vous pouvez essayer ceci

 Un fichier avec EOL après le dernier numéro ressemble à: 
 1 _ 
 2 _ 
 3 _ 
 EOF 
 
 mais un fichier sans ce dernier caractère ressemble à 
 
 1 _ 
 2 _ 
 3 
 EOF 
 
 où _ signifie un caractère d'espace 

Vous pouvez essayer d'analyser le contenu du fichier à l'aide de php pour voir ce qu'il contient


$lines = explode( PHP_EOL, file_get_contents($file));
foreach($lines as $line ) {
    var_dump($line);
}

...rusé

55
eridal

pauls answer a la bonne approche mais il a une erreur. ce dont vous avez besoin est le suivant:

file_put_contents($filename, trim($commentnumber).PHP_EOL, FILE_APPEND);

la constante PHP_EOL s'assure d'utiliser la bonne ligne se terminant sur les systèmes mac, windows et unix, la fonction trim supprime toute nouvelle ligne ou espace des deux côtés de la chaîne. la conversion en entier serait une énorme erreur car 1. vous pourriez finir par avoir zéro, en particulier à cause des espaces blancs ou des caractères spéciaux (d'où qu'ils viennent ...) 2. les identifiants n'ont pas nécessairement besoin d'être des entiers

15
The Surrican

Ohh les gars! Utilisez simplement

\ r\n

au lieu de \ n

11
M_R_K

enregistrement ennuyeux, ce que vous avez là est tout à fait bien. PHP_EOL et "\ n" sont exactement les mêmes.

Le code que vous avez fourni n'a rien de mal à cela, il doit donc être la valeur de $ commentnumber qui a un espace à la fin. comme indiqué, exécutez votre $ commentnumber via la fonction trim ().

file_put_contents($filename, trim($commentnumber . "\n"), FILE_APPEND);

Bonne chance.

1
Paul Dragoonis

Après avoir lu votre code et vos réponses, j'ai trouvé une théorie ...

Comme je ne peux pas voir qu'il y a un problème avec votre code, comment avez-vous ouvert et lu le fichier? L'avez-vous réellement ouvert dans un éditeur de texte? Avez-vous utilisé un script PHP pour le faire? Si c'est le cas, ouvrez le fichier avec un éditeur de texte et vérifiez qu'il y a bien des espaces à la fin de chaque ligne. S'il y a effectivement ... eh bien, ignorez le reste de cette réponse, sinon, continuez à lire.

Par exemple, si vous utilisez quelque chose comme ceci:

<?php
$lines = file($filename);
if($lines) // Error reading
  die();
foreach($lines as $line)
  echo $line."<br />";

Ensuite, vous feriez toujours un espace à la fin de la ligne en raison de la façon dont file() fonctionne. Assurez-vous que chacun$linen'a pas d'espace blanc - comme un caractère de nouvelle ligne - à la fin.
Puisque HTML gère tous les espaces blancs - espaces, tabulations, sauts de ligne etc. - comme des espaces, s'il y a un espace blanc à la fin de $line, Ceux-ci apparaîtront alors comme des espaces dans la sortie HTML.

Solution: utilisez rtrim($line) pour supprimer les espaces blancs à la fin des lignes. En utilisant le code suivant:

<?php
$lines = file($filename);
if($lines) // Error reading
  die();
foreach($lines as $line)
  echo rtrim($line)."<br />";

n'aurait pas les mêmes problèmes que le premier exemple, et tous les espaces à la fin des lignes seraient partis.

0
Frxstrem

Il n'y a rien dans le code que vous avez fourni qui générerait ces espaces, sauf si $commentnumber Contient déjà l'espace pour commencer. Si tel est le cas, utilisez simplement trim($commentnumber) à la place.

Il n'y a également rien dans votre code qui expliquerait les lignes vides au bas du fichier, à moins que $commentnumber Puisse être une chaîne vide. Si tel est le cas et que vous souhaitez qu'il affiche le nombre 0 À la place, utilisez intval($commentnumber).

Bien sûr, vous n'avez besoin que d'un seul de ces deux. Si vous souhaitez conserver le contenu de type chaîne, utilisez trim(); si vous voulez toujours des entiers, utilisez intval(), qui le coupe déjà automatiquement.

Il est également possible que vous ayez accidentellement écrit " \n" Au lieu de "\n" Dans votre code actuel, mais dans le code que vous avez publié ici, il est correct.

0
Timwi