Работа с текстом.

Crazy

Developer
Операция открытия строки лишена смысла -- их никто не закрывал.
 

XaMMeR

Guest
в смысле прочитать? если да то :
открыть в\файл для чтения
и функцией fgets($FH,nnnn) - прочитать строку

причём:
$fh- файловый манипулятор,
nnnn - число заведомо большее чем длинна строки
обычно -4096 байт
 

Николай

PHP - CooL
Вы наверно не правильно поняли... Вот к примеру есть файл в нем 5 строк на каждой строке своя надпись, ну дак вот как мне открыть к примеру 3 строчку и написать в ней то что мне надо, не трогая при этом остальные строчки?
 

Crazy

Developer
Еще раз: ты не можешь открыть строчку, ибо ее никто не закрывал.

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

Lanu

Guest
Crazy, а вот я сел и все ровно ничего не получается :(
Пробовал сначала fseek-ом, но зашел в тупик, не знаю как передать функции параметр offset, то есть размер моего стринга в байтах.
После долгих и мучительных экспериментов плюнул на все это и решил использовать массив. Но не тут-то было! Пишу:
PHP:
//записываю весь файл в массив
$filecontent = file("testfile.txt");

//проверяю если есть то что мне нужно и меняю
for($i=0; $i<sizeof($filecontent); $i++)
if(strpos($filecontent[$i], "some_text")) {
  $filecontent[$i] = "new_text";
  break;
}

//записываю измененный массив в файл
$filehdl = fopen("testfile.txt", "w");
for($i=0; $i<sizeof($filecontent); $i++)
  fwrite($filehdl, $filecontent[$i]);
fclose ($filehdl);
Ни фига :[ содержание файла не изменилось, скрипт даже не заходит в if-е, но в файле точно есть строка которая содержит слово "some_text"!
Ну где же ошибка?
 

gRigoriy

Новичок
strpos($filecontent[$i], "some_text")
А что это означает?
А не лучше ли сделать trim(content[$i])=="some_text"?
//записываю измененный массив в файл
$filehdl = fopen("testfile.txt", "w");
for($i=0; $i<sizeof($filecontent); $i++)
fwrite($filehdl, $filecontent[$i]);
fclose ($filehdl);
А здесь не мудрствуя лукаво написать
PHP:
$filehdl=fopen("testfile.txt", "w"); 
fputs($filehdl,@implode("",$filecontent));
fclose($filehdl);
 

Lanu

Guest
a) Объясняю:
PHP:
for($i=0; $i<sizeof($filecontent); $i++) 
if(strpos($filecontent[$i], "some_text")) { /*do something*/ }
- ищет в каждой строке массива слово "some_text"

b) При чем тут функция trim(), она же "Strip whitespace from the beginning and end of a string" (удаляет пробелы в начале и/или в конце стринга)?!?
 

Lanu

Guest
А здесь не мудрствуя лукаво написать
PHP:
$filehdl=fopen("testfile.txt", "w"); 
fputs($filehdl,@implode("",$filecontent));
fclose($filehdl);

Вот тут согласен, но это уже оптимизация кода, и никак не влияет на решении проблемы :)
 

gRigoriy

Новичок
Попробуй вместо strpos(...) substr(...), т.к. strpos по-моему возврашает число... И поэтому в ифе надобна, наверно,написать strpos(...)!="". А лучше не изврашатся и написать субстр...
 

DiMA

php.spb.ru
Команда форума
Уваж-й, ты хочешь, чтобы тебе пересказали главу из учебника по обучению работе с файлами? Я тебя огорчу - никто этого не сделает. Но ты не волнуйся, чисто теоретически это возможно - форум открыт для всех. Жди.
 

Lanu

Guest
А как можно использовать функцию substr(...), она же не может сравнивать два стринга, а только возвращает кусочек одного с заданой позиции...
А проблема в действительности была в strpos(...), и все заработало с функцией strstr(...)! Спасибо!

И уже из спортивного интереса, может кто-то покажет пример чтения/записи/изменения файла с помощью функции fseek(...) :cool:
 

Николай

PHP - CooL
Спасибо большое...............Lanu сейчас все работает. Но вот только еще кое-что: этот пример работает только если нужный текст заведомо известен, а если он не известен? А надо открыть нужную строку?
 

RomikChef

Guest
Коля, когда будешь вместе со своими коллегами кухарками общаться, можешь говорить "нужная строка".
А здесь ты, как это ни странно звучит - программист.
Выражайся более осмысленно.
Какой критерий нужности?

Вот, по кухаркинским делам наверняка ты покупаешь продукты. Если на витрине 10 сортов яблок, ты ведь не говоришь "дайте мне яблоко". Ты говоришь - КАКОЕ.
Значит, можешь сформулировать.
вот и здесь постарайся.
 

RomikChef

Guest
Lanu
Чтение просто. Открываешь файл, фсикаешь на нужное место, читаешь, сколько хочешь.
Писать и изменять - это одно и тоже. открываешь на r+ (спасибо Crazy за подсказку), фсикаешь на нужное место и пишешь, сколько хочешь. Инфа, бывшая, на этом месте, будет, естествено, затерта.

Вот как я пишу, к примеру, с предпоследней позиции в файле.
PHP:
$fd = fopen ($filename, "r+");
fseek($fd,$fsize-1);
fwrite($fd,$s);
fclose($fd);
 

Lanu

Guest
Николай, ты сможешь "открыть" любую строку после того как записал весь файл в массив. Например, если тебе нужна 3-я строчка файла, она сейчас в массиве $filecontent на 2-ой позиции (доступ к ней - $filecontent[2])... ...читай в мануале про массивы!

RomikChef, извини но что-то не доходит :(
А что мне делать если нужно поменять какое-то слово где-то посередине файла (как "фсикать на нужное место"), да еще новое слово длиннее/короче старой?
 

Николай

PHP - CooL
Может если я напишу все по подробнее, не буду выглядеть как кухарка...

Представь себе что есть файл jopa.txt на первой строчке количество посещений моего сайта, на второй уникальные посетители тоесть все цифры меняются, они не стоят на месте, человек зашел стало 10 посетителей, а не 9, а если пользоваться твоим скриптом, то произойдет глюк! А мне то именно надо открывать строчку, а не по счету от начала файла!
 
Сверху