file_put_contents, file_append и разрывы строк - PullRequest
31 голосов
/ 21 августа 2010

Я пишу скрипт PHP, который добавляет числа в текстовый файл. Я хочу, чтобы в каждой строке было по одному номеру, например:

1
5
8
12

Если я использую file_put_contents($filename, $commentnumber, FILE_APPEND), результат будет выглядеть так:

15812

Если я добавляю разрыв строки, например file_put_contents($filename, $commentnumber . "\n", FILE_APPEND), после каждого числа добавляются пробелы и одна пустая строка в конце (подчеркивание представляет пробелы):

1_
5_
8_
12_
_
_

Как заставить эту функцию добавлять числа так, как я хочу, без пробелов?

Ответы [ 7 ]

54 голосов
/ 21 августа 2010

Вы пробовали с константой PHP EOL?


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

--- Добавлено ---

Я просто понимаю, что мой файловый редактор делает то же самое, но не беспокойтесь, это просто призрачный символ, который редактор помещает туда, чтобы сигнализировать о наличии новой строки. Вы можете попробовать это

A file with EOL after the last number looks like:
1_
2_
3_
EOF

but a file without that last character looks like

1_
2_
3
EOF

where _ means a space character

Вы можете попытаться проанализировать содержимое файла, используя php, чтобы увидеть, что внутри


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

... tricky

15 голосов
/ 22 августа 2010

Полс ответ имеет правильный подход, но он ошибся.Вам нужно следующее:

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

константа PHP_EOL гарантирует использование правильной строки, заканчивающейся в системах Mac, Windows и Unix. Функция trim удаляет любые символы новой строки или пробелы с обеих сторон строки.преобразование в целое число было бы огромной ошибкой, потому что: 1. у вас может получиться ноль, особенно из-за пробелов или специальных символов (откуда бы они ни приходили ...) 2. идентификаторы не обязательно должны быть целыми числами

10 голосов
/ 10 июля 2014

ооо ребята!Просто используйте

\ r \ n

в \ n

1 голос
/ 21 августа 2010

раздражает регистрация, то что у вас там абсолютно нормально. PHP_EOL и "\ n" абсолютно одинаковы.

В коде, который вы указали, нет ничего плохого в этом, поэтому это должно быть значение $ commentnumber с пробелом в конце. как указано, запустите ваш $ commentnumber с помощью функции trim ().

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

Удачи.

0 голосов
/ 22 июня 2012

, потому что каждый раз, когда вы пишете в файл, файл заканчивается, file_put_contents вставляет дополнительный разрыв строки в конце

0 голосов
/ 21 августа 2010

Прочитав ваш код и ответы, я выдвинул теорию ...

Поскольку я не вижу, что с вашим кодом что-то не так, как вы открыли и прочитали файл? Вы действительно открыли его в текстовом редакторе? Использовали ли вы PHP-скрипт для этого? Если это так, откройте файл в текстовом редакторе и убедитесь, что в конце каждой строки есть пробелы. Если есть на самом деле ... ну, игнорируйте остальную часть этого ответа, тогда. Если нет, просто продолжайте читать.

Например, если вы используете что-то вроде этого:

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

Тогда в конце строки всегда будет пробел, потому что file() работает. Убедитесь, что у каждого $line нет пробела - например, символ новой строки - в конце.
Поскольку HTML обрабатывает все пробелы - пробелы, табуляции, переводы строк и т. Д. - как пробелы, если в конце $line есть пробелы, то они будут отображаться как пробелы в выводе HTML.

Решение: используйте rtrim($line) для удаления пробелов в конце строк. Используя следующий код:

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

не будет иметь тех же проблем, что и в первом примере, и все пробелы в конце строк исчезнут.

0 голосов
/ 21 августа 2010

В предоставленном вами коде нет ничего, что могло бы генерировать эти пробелы, если только $commentnumber уже не содержит пробел для начала.Если это так, просто используйте вместо этого trim($commentnumber).

В вашем коде также нет ничего, что объясняло бы пустые строки внизу файла, если только $commentnumber не может быть пустой строкой.Если это так, и вы хотите, чтобы вместо него выводилось число 0, используйте intval($commentnumber).

Конечно, вам нужен только один из этих двух.Если вы хотите сохранить строковый контент, используйте trim();если вам всегда нужны целые числа, используйте intval(), который автоматически обрезает его.

Возможно также, что вы случайно написали " \n" вместо "\n" в своем действительном коде, но в коде, который вы разместилиздесь это правильно.

...