Есть ли функция, которая понимает, что от пробела до пробела - стоит именно число.
Спустя 2 минуты, 52 секунды (18.03.2009 - 17:58) Guest написал(а):
<?php
$a=explode(" ", file_get_contents("file.txt"));
// Теперь все числа записаны в массиве $a. ъ
?>
$a=explode(" ", file_get_contents("file.txt"));
// Теперь все числа записаны в массиве $a. ъ
?>
Спустя 46 секунд (18.03.2009 - 17:59) Cookson написал(а):
Это я, не залогинился
Спустя 17 минут, 28 секунд (18.03.2009 - 18:16) aromanu написал(а):
Guest, у меня лаба по следующей тематике: Сортировка элементов в файле.
По алгоритму нужно будет переставлять числа в файле по тем или иным параметрам. Файл не маленький. Так как вы предложили конечно можно, но каждый раз, когда требуется перестановка считывать весь файл, перестанавливать числа в массиве, а затем обратно в файл. Я хочу, что бы это все происходило "не отходя от кассы" в файле.
Я придумал способ решения, но он слишком муторный. Я создал две функции, чтение из файла запись в файл элементов.
Если интересно то вот они:
function position(&$pos) #функция определяет позиции элементов файла с учетом того
{ #что под элемент отведена не одна позиция а несколько, причем заранее не известно
#используем двумерный массив 1-ый эл. - позиция начала объекта, 2-ой эл. - позиция
#конца объекта
global $file;
$i= 1; #индикатор начальной и конечной позиций элемента в файле
$j= 0;
$k= 0;
fseek($file, 0, SEEK_SET); #установка указателя в начало файла
while(($ch= fgetc($file)) == ' ');
$pos[$j][$k]= ftell($file);
$k= 1;
while($ch= fgetc($file)) #читаем до конца файла
{
if($ch == ' ') #в конструкции фиксируем начальные и конечные позиции элементов в файле
{
$i*= -1;
if($i == 1) #фиксируем начальную позицию
{
fseek($file, 1, SEEK_CUR);
$pos[$j][$k]= ftell($file);
$k= 1;
}
else #фиксируем конечную позицию
{
fseek($file, -1, SEEK_CUR);
$pos[$j][$k]= ftell($file);
++$j;
$k= 0;
}
}
}
if($i == 1) #выявляем наличие присутствия конечной позиции конечного элемента
{
fseek($file, 0, SEEK_END);
$pos[$j][$k]= ftell($file);
}
}
function replacemant($pos, $a, $b) #функция меняет местами элементы в файле
{
global $file;
fseek($file, $pos[$b][0] - 1, SEEK_SET);
$str= fgets($file, $pos[$b][1] - $pos[$b][0] + 2); #запись второго элемента
for($i= $a + 1; $i < $b; ++$i) #запись элементов, находящихся между первым и вторым
{
fseek($file, $pos[$i][0] - 1, SEEK_SET);
$str= $str.' '.fgets($file, $pos[$i][1] - $pos[$i][0] + 2);
}
fseek($file, $pos[$a][0] - 1, SEEK_SET);
$str= $str.' '.fgets($file, $pos[$a][1] - $pos[$a][0] + 2); #запись первого элемента
fseek($file, $pos[$a][0] - 1, SEEK_SET);
fwrite($file, $str);
}
То есть здесь создается массив индексов, показывающий к какой позиции в файле начинается число после какой-либо перестановки, а также кол-во символов, отведенное под число.
Есть ли способ, что бы это сделать одной функцией?
Да и еще, есть ли функция, которая не считывает строку а вырезает ее из файла(нужно сделать стек с помощью файла). И если мы вырезали строку, то размер файла автоматически уменьшается на вырезанную строку или все заполняется пробелами?
По алгоритму нужно будет переставлять числа в файле по тем или иным параметрам. Файл не маленький. Так как вы предложили конечно можно, но каждый раз, когда требуется перестановка считывать весь файл, перестанавливать числа в массиве, а затем обратно в файл. Я хочу, что бы это все происходило "не отходя от кассы" в файле.
Я придумал способ решения, но он слишком муторный. Я создал две функции, чтение из файла запись в файл элементов.
Если интересно то вот они:
function position(&$pos) #функция определяет позиции элементов файла с учетом того
{ #что под элемент отведена не одна позиция а несколько, причем заранее не известно
#используем двумерный массив 1-ый эл. - позиция начала объекта, 2-ой эл. - позиция
#конца объекта
global $file;
$i= 1; #индикатор начальной и конечной позиций элемента в файле
$j= 0;
$k= 0;
fseek($file, 0, SEEK_SET); #установка указателя в начало файла
while(($ch= fgetc($file)) == ' ');
$pos[$j][$k]= ftell($file);
$k= 1;
while($ch= fgetc($file)) #читаем до конца файла
{
if($ch == ' ') #в конструкции фиксируем начальные и конечные позиции элементов в файле
{
$i*= -1;
if($i == 1) #фиксируем начальную позицию
{
fseek($file, 1, SEEK_CUR);
$pos[$j][$k]= ftell($file);
$k= 1;
}
else #фиксируем конечную позицию
{
fseek($file, -1, SEEK_CUR);
$pos[$j][$k]= ftell($file);
++$j;
$k= 0;
}
}
}
if($i == 1) #выявляем наличие присутствия конечной позиции конечного элемента
{
fseek($file, 0, SEEK_END);
$pos[$j][$k]= ftell($file);
}
}
function replacemant($pos, $a, $b) #функция меняет местами элементы в файле
{
global $file;
fseek($file, $pos[$b][0] - 1, SEEK_SET);
$str= fgets($file, $pos[$b][1] - $pos[$b][0] + 2); #запись второго элемента
for($i= $a + 1; $i < $b; ++$i) #запись элементов, находящихся между первым и вторым
{
fseek($file, $pos[$i][0] - 1, SEEK_SET);
$str= $str.' '.fgets($file, $pos[$i][1] - $pos[$i][0] + 2);
}
fseek($file, $pos[$a][0] - 1, SEEK_SET);
$str= $str.' '.fgets($file, $pos[$a][1] - $pos[$a][0] + 2); #запись первого элемента
fseek($file, $pos[$a][0] - 1, SEEK_SET);
fwrite($file, $str);
}
То есть здесь создается массив индексов, показывающий к какой позиции в файле начинается число после какой-либо перестановки, а также кол-во символов, отведенное под число.
Есть ли способ, что бы это сделать одной функцией?
Да и еще, есть ли функция, которая не считывает строку а вырезает ее из файла(нужно сделать стек с помощью файла). И если мы вырезали строку, то размер файла автоматически уменьшается на вырезанную строку или все заполняется пробелами?
Спустя 2 часа, 1 минута, 44 секунды (18.03.2009 - 20:18) aromanu написал(а):
Профи, вы где?

Спустя 8 минут, 35 секунд (18.03.2009 - 20:27) modobaks написал(а):
Я что, то не пойму, чем тебе не устраивает вариант такой: читаешь полностью файла, экплодишь, сортируешь, а потом сохроняешь. По методу Cookson
Спустя 15 минут, 39 секунд (18.03.2009 - 20:42) aromanu написал(а):
У меня лаба "сортировка элементов в файле методом Бэтчера"
Нужно что действия происходили в файле.
Вчера принес преподу версию с буфером в виде массива.
Цитирую препода: Молодой человек, так не катит, хочу что бы все было на месте в файле, и никаких буферов, никаких массивов.
Нужно что действия происходили в файле.
Вчера принес преподу версию с буфером в виде массива.
Цитирую препода: Молодой человек, так не катит, хочу что бы все было на месте в файле, и никаких буферов, никаких массивов.
Спустя 17 минут, 14 секунд (18.03.2009 - 21:00) kirik написал(а):
Цитата (aromanu @ 18.03.2009 - 10:16) |
По алгоритму нужно будет переставлять числа в файле по тем или иным параметрам. |
Не понял.. По каким параметрам? И в каком виде числа содержатся в файле?
Спустя 41 минута, 38 секунд (18.03.2009 - 21:41) aromanu написал(а):
Параметры это одно число больше друго, или они равны или наоборот, то есть по возрастанию, или по убывания, направление просмотра и т.д.
Числа хранятся в виде чисел 4 3 5 234 234 21 234 214 между ними пробел. Или в PHP все есть строка?
Числа хранятся в виде чисел 4 3 5 234 234 21 234 214 между ними пробел. Или в PHP все есть строка?
Спустя 18 минут, 15 секунд (18.03.2009 - 21:59) sergeiss написал(а):
Цитата (aromanu @ 18.03.2009 - 20:42) |
У меня лаба "сортировка элементов в файле методом Бэтчера" Нужно что действия происходили в файле. Вчера принес преподу версию с буфером в виде массива. Цитирую препода: Молодой человек, так не катит, хочу что бы все было на месте в файле, и никаких буферов, никаких массивов. |
У меня есть смутное подозрение, что препод "не совсем" представляет, что такое файл, буфер, массив...
Потому что такого дебилизма мне еще не приходилось слышать еще

Второй вариант - студент не понял совершенно, что сказал преподаватель

Спустя 15 минут, 53 секунды (18.03.2009 - 22:15) aromanu написал(а):
никакого дебилизма здесь совершенно нет и препод и я понимаем о чем идет речь.
Еще раз объясню для тугих
Открываем файл, сравниваем читаем 2 числа, сравниваем их, если одно меньше другого, то делаем следующее, вырезаем первое, записываем на его место второе, вырезаем второе, записываем на его место первое. Не требуется что бы весь файл загружался в массив. Все делается на месте, в файле. Если и опять не дошло то посмотри на три функции, которые я написал, по ним все работает, но это слишком муторно.
Вот я и спрашиваю еще раз:
есть ли в PHP что бы она читала число из файла.
Никак не могу донести того чего я хочу. Может быть я неправильно ставлю задачу.
Вся фишка алгоритма в том что сортировка происходит именно в файле то есть перестановки не в массиве а в файле. Здесь совершенно не имеет смысла для чего созданы массивы. Да конечно через массивы проще, но в алгоритме четко сказано что этого не требуется.
Еще раз объясню для тугих

Вот я и спрашиваю еще раз:
есть ли в PHP что бы она читала число из файла.
Никак не могу донести того чего я хочу. Может быть я неправильно ставлю задачу.
Вся фишка алгоритма в том что сортировка происходит именно в файле то есть перестановки не в массиве а в файле. Здесь совершенно не имеет смысла для чего созданы массивы. Да конечно через массивы проще, но в алгоритме четко сказано что этого не требуется.
Спустя 2 минуты, 12 секунд (18.03.2009 - 22:18) Kuliev написал(а):
aromanu
Что то я не совсем понял, что тебе нужно!
Хотя как я понимаю тебе надо отсортировать цифры в файле по убыванию или по возрастанию ???
Что то я не совсем понял, что тебе нужно!
Хотя как я понимаю тебе надо отсортировать цифры в файле по убыванию или по возрастанию ???
Спустя 2 минуты, 25 секунд (18.03.2009 - 22:20) sergeiss написал(а):
Цитата (aromanu @ 18.03.2009 - 22:15) |
Еще раз объясню для тугих ![]() |
Ну ежели ты такой "умный"... То сам и делай. Чего нас, дебилов тугоумных, спрашивать?
Но когда до тебя и до препода дойдет, что "работа в файле" - это всё равно использование буферов, и постоянное перезаписывание данных на диске будет просто фатально тормозить работу... То, может, тебе кто из "тугих" и подскажет, как это исправить.
ОК, "умник"?

Спустя 6 минут, 1 секунда (18.03.2009 - 22:26) kirik написал(а):
Цитата (aromanu @ 18.03.2009 - 14:15) |
Открываем файл, сравниваем читаем 2 числа, сравниваем их, если одно меньше другого, то делаем следующее, вырезаем первое, записываем на его место второе, вырезаем второе, записываем на его место первое. |
Имеем
6 5 4 3 2 1
после первого прохода получаем
5 6 4 3 2 1
после второго
5 4 6 3 2 1
после третьего
5 4 3 6 2 1
четвертого
5 4 3 2 6 1
пятого
5 4 3 2 1 6
Сколько проходов нужно будет сделать чтобы отсортировать 6 чисел?
Цитата (aromanu @ 18.03.2009 - 10:16) |
Файл не маленький. |
а миллион чисел? А какая будет производительность данного алгоритма? А какая производительность алгоритма с массивами? И это не "дебилизм"?
Но не ссуть.. Есть задача, нужно решение. Щас придумаем че-нить.

ЗЫ. ребят, не ругайтесь


Спустя 4 минуты, 52 секунды (18.03.2009 - 22:31) aromanu написал(а):
sergeiss, давайте не будем обижаться без повода для обид. прошу прошения, если плохо слежу за своей речью. Я понимаю что что файл и есть буфер. Выше я же писал, что ни каких буферов в виде массивов Я понимаю что это фатально тормозит работу и все такое.
Спустя 4 минуты, 42 секунды (18.03.2009 - 22:36) sergeiss написал(а):
Я не обижаюсь... Но посылать куда-то далеко людей, которые отвечают на тобой же заданные вопросы - это норма жизни?
А вообще, ежели тебе не нужен массив, то используй "переменные переменные". Хотя, по сути, получишь всё равно то же самое, что и массив
Только с ненужным гемором. И с очень большим.
А вообще, ежели тебе не нужен массив, то используй "переменные переменные". Хотя, по сути, получишь всё равно то же самое, что и массив
