Войти

Показать полную графическую версию : Запись/чтение в/из файла по строчно + удаление элементов...


Georgiy
17-07-2004, 00:53
1. Как считать из файла определенную строку? Как записать в файл на место одной строки другую?

Я пользовался функцией file(), то есть считал весь файл в массив-список и дальше работал со строками-элементами массива. Но при записи в файл fputs(,массив[$i]) / fwrite(,массив[$i]) в конец каждой строки файла добавлялся неопределенный символ. По-видимому - это "\n" или "\r\n".
Как правильно считывать и записывать в файл отдельные строки?
+ как избежать проблем с разным пониманием символов конца строки для UNIX/Windows?

2. Есть массив, созданный в цикле "на лету", то есть $Mass[]="abcd", $Mass[]="efhg", ...
Как мне наиболее граммотно удалить какой-нибудь элемент этого массива, так, чтобы после этого не было бы "дыр" в массиве? В общем, хотелось бы "совсем" удалить несколько элементов.

Исправлено: Georgiy, 0:55 17-07-2004

Vlad Drakula
17-07-2004, 02:58
Georgiy
1) если хочешь работать с отдельными строками то так и придется делать, иначе ни как.
для задания кодировки есть настройка AddDefaultCharset в файле httpd.conf

2) помоему придется удалять его в ручную...

vadimiron
17-07-2004, 15:29
Georgiy
2)эллемент из массива удаляется с помощью unset($a[key]);
При этом не образуется никакой дыры, пара ключ/значение полностью удаляются

1)В мануале написано, что можно от знаков окончания строки избавится с помощью функции trim()
То есть читаем файл с помощью file(), а потом с помощью array_walk делаем trim() каждому элементу


Исправлено: vadimiron, 13:30 17-07-2004

mar
17-07-2004, 20:05
вдогонку - упмянутая тут директива AddDefaultCharset - установка кодировки, но не конца строк, разных в unix и win, о чем, насколько я поняла, спрашивал  Georgiy. То есть тут не при чем :o
От знаков окончания строки, как уже написал vadimiron можно избавиться при помощи trim(), или, если удалять все это, откусывая именно от конца строки: rtrim() или chop()

Georgiy
18-07-2004, 02:13
vadimiron
Я почти также и делал: для каждой строки
$string=str_replace("\r","",$string);
Вот и подумал - что наверняка есть лучше метод. Плюс если это работает в Винде, как будет на другой ОС...

Vlad Drakula
Да, согласен с mar про догонку...
А про массив - в ручную, это через временные массивы?

Про unset: я применял эту функцию, но после применения этой функций дальше массив становился совсем пустым, хотя удалял 3 первых элемента...

mar
18-07-2004, 14:40
Georgiy
по поводу конца строк: дело в том, что как раз trim(), или, если удалять все это, откусывая именно от конца строки: rtrim() или chop() в плане избавления от кодов конца строк более универсальны, чем *использование str_replace():
string rtrim ( string str [, string charlist])

Замечание: Второй аргумент был добавлен в PHP 4.1.0

Эта функция возвращает строку str с удаленными из конца строки пробелами. Если второй параметр не передан, rtrim() удаляет следующие символы:

" " (ASCII 32 (0x20)), символ пробела.
"\t" (ASCII 9 (0x09)), символ табуляции.
"\n" (ASCII 10 (0x0A)), символ перевода строки.
"\r" (ASCII 13 (0x0D)), символ возврата каретки.
"\0" (ASCII 0 (0x00)), NUL-байт.
"\x0B" (ASCII 11 (0x0B)), вертикальная табуляция.

Можно также задать список символов для удаления с помощью аргумента charlist. С помощью .. можно задать диапазон символов.

Что касается unset - начиная с 4-ой версии PHP это языковая конструкция, а не функция, поэтому попытка вернуть из нее значение может вызвать ошибку. Ну и, если требуется удялять первые, или последние элементы массива, то проще воспользоваться функциями array_shift(), *или array_pop() соответственно




© OSzone.net 2001-2012