Как управлять курсором строки?

SystemKiller

Новичок
Есть у нас файл text.txt, его содержание такое:
Первая строка
Вторая строка
Третья строка
Четвертая строка
Пятая строка
Шестая строка
Седьмая строка
Восьмая строка
Девятая строка
Десятая строка
Мы его открываем и читаем построчно:
PHP:
$file=fopen("text.txt","r");

while( !feof($file) )
{
     $str=fgets($file,1024);

     if( strpos($str,"Шестая строка")!==false )
     {
          echo('Вот тут я хочу вернуться на предыдущую строку, т.е. на пятую. Как это сделать?');
     }
}
Возможно ли управлять курсором? Т.е. вернуться на предудыщую строку?

У меня есть вариант как это сделать, но мне он не нравится - т.к. скажется на быстродействии, если в файле очень очень много строк будет, а идея такова:
Если найдено совпадение, закрываем файл и открываем заново (курсор устанавливается на начало файла) и в цикле вызываем команду fgets($file,0) такое кол-во раз, на какую строку нужно перейти
А вот её код:
PHP:
$file=fopen("text.txt","r");
$a=0;

while( !feof($file) )
{
     $a++;
     $str=fgets($file,1024);

     if( strpos($str,"Шестая строка")!==false )
     {
          fclose($file);
          $file=fopen("text.txt","r");
          for($i=0;$i<$a;$i++)
                {
                fgets($file,0);
                }
          break;
     }
}
Неужели в PHP не предусмотрено функции управления курсором строки?
Т.е. если fgets() передвигает курсор на след. строку, то мне нужна такая-же функция, передвигающая курсор на предыдущую строку, либо на строку, номер которой можно указать в функции.

Подскажите, пожалуйста. Вроде бы обьяснил максимально понятно, чего мне нужно.

P.S. Знаю, что можно просто открыть файл вот так - $file=file("text.txt"); и легко получать любую строку, номер которой можно указать. (echo($file[4]);).

Этот вариант удобен. Но представьте, если в файле миллион строк? А если ещё больше?
PHP будет в память загружать такой большой массив(если будет - не проверял) - это скажется на быстродействии...
А если построчно файл читать - то пофигу сколько строк, т.к. в память загружается только по одной строке. Тут ограничение только по максимальному кол-ву времени выполнения скрипта.
 

SystemKiller

Новичок
И второй вопрос... Если нужно перезаписать длинную строку в файле короткой строкой, то короткая перезаписывает длинную, но после этой короткой строки длинная всеравно остается.

К примеру мы пытаемся перезаписать эту строку:
Вот этой строкой:
То она ее перезапишет вот так:
Как ее можно сначала стереть, а потом записать в неё новую строку? (При этом читая файл построчно)

P.S. Зачем мне всё это нужно? Я практикуюсь в создании текстовой БД на PHP, поэтому мне хочется не только читать базу от первой строки до последней, но и прочесть например сразу 5-ую строку или когда я прочту первые 5 строк и встречу там то, что мне нужно - после этого вернуться на 2 строки назад.
P.P.S. Не предлагайте мне MySQL, SQL Lite, готовые текстовые БД на PHP, т.к. я просто ПРАКТИКУЮСЬ для себя. И мне нужны ответы именно на поставленные вопросы, т.к. нужно знать как такое сделать можно. Если что - можете предложить какую-нить очень простую текстовую БД, написанную на PHP - чтобы я посмотрел как там это делается. В теме рядом человек выложил свой скрипт своей текстовой БД, но он на классах - а я в них плохо понимаю, не хочу вникать сейчас в них - темболее там код кривой как он написал.
 

Вурдалак

Продвинутый новичок
Краткость — сестра таланта...

http://php.net/manual/en/function.fseek.php

По поводу второго: если после этой строки ничего нет, то можно использовать ftruncate(). В противном случае придётся все данные, находящиеся после записанного куска сдвигать влево (считывать-записывать).
 

SystemKiller

Новичок
Вурдалак, спасибо за ответ.

По поводу первого:
Функцию fseek() знаю, но она сдвигает на кол-во байт, а мне нужно сдвинуть на номер строки. Я ведь не знаю сколько в той или иной строке байт.
Конечно можно узнавать кол-во байт каждой строки и сдвигать на это кол-во байт, но этот вариант не очень удобный...
Есть ли подобная функция, сдвигающая на номер строки?

По поводу второго:
Не совсем понял, как это - сдвигать влево? Обьясни, пожалуйста.

P.S. А как в текстовых БД такое обычно реализуют? Т.е. нужно же не только в конец файла записывать, но и редактировать определенную строку, например, да и сортировать как-то нужно. Мне бы теорию, а на практике я сам попробую реализовать это. Если что не пойму - поинтересуюсь...
 

Вурдалак

Продвинутый новичок
SystemKiller, для написания такой функции придётся именно гулять по файлу, подсчитывая количество переводов строк и, соответственно, узнавая номер строки, либо заранее где-то хранить смещения (позиции) всех переводов строк (типа индекс). Чисто ради интереса могу тебе сказать, что можно было бы хранить строки фиксированной длины (в самом простом случае просто дополняя короткие строки до нужной пробелами справа). Тогда, во-первых, текст может содержать переводы строк, во-вторых, их расположение не будет тебя волновать и ты будешь знать позицию нужной тебе записи, зная её порядковый номер и выбранную тобой фиксированную длину строки ($offset = $n * $len).

Изучи сначала как хранятся файлы на компе.
 

SystemKiller

Новичок
Огромное спасибо, Вурдалак!
Ты мне подал очень хорошую идею, на счет того, что можно хранить строки фиксированной длины. Как бы получается можно как и в MySQL задавать размер каждого столбца. и сколько он в себе может хранить. Как я сам до этого не додумался... Супер!

А на счет сортировки строк не подскажешь? например по столбцу ID...
У меня есть вариант, но не очень мне нравится... Какой бы ты предложил? В теории...

P.S. На счет того, как хранятся файлы на компе - а оно мне точно надо? Если надо - кинь ссылку. Я поискал, много всего нашел, но не знаю что именно мне нужно.
 

SystemKiller

Новичок
На счет сортировки строк.. Я ж не рассказал как база будет выглядеть. К примеру таблица USERS - это файл USERS.txt, а выглядит он так:

PHP:
id    |name               |soname
3     |Sasha              |Petrov
2     |Dmitriy             |Sidorov
1     |Alex                 |Utkin
Есть идеи, как его сортировать по ID можно? Т.е. чтоб было:
PHP:
id    |name               |soname                           
1     |Alex                 |Utkin
2     |Dmitriy             |Sidorov
3     |Sasha              |Petrov
 

iceman

говнокодер
еще один разработчик СУБД на ПХП?
огурцов объелись что ли?
 

baev

‹°°¬•
Команда форума
Если что - можете предложить какую-нить очень простую текстовую БД, написанную на PHP - чтобы я посмотрел как там это делается. В теме рядом человек выложил свой скрипт своей текстовой БД, но он на классах - а я в них плохо понимаю, не хочу вникать сейчас в них - темболее там код кривой как он написал.
— я в теме
http://phpclub.ru/talk/threads/Быстрая-база-на-файлах-для-узких-целей.68240/page-3
уже давал ссылку: http://forum.dklab.ru/viewtopic.php?t=28147&postdays=0&postorder=asc&start=0
 
Сверху