[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Чтение чисел из файла
aromanu
Как реализовать чтение чисел из файла? Существуют ли такие функции, аргументом которых является число из файла. Другими словами: есть файл, там числа, переменной длинны, 123 21 32323424 32 112 4 04 234 423 -3242 7
Есть ли функция, которая понимает, что от пробела до пробела - стоит именно число.



Спустя 2 минуты, 52 секунды (18.03.2009 - 17:58) Guest написал(а):
<?php
$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);
}

То есть здесь создается массив индексов, показывающий к какой позиции в файле начинается число после какой-либо перестановки, а также кол-во символов, отведенное под число.
Есть ли способ, что бы это сделать одной функцией?
Да и еще, есть ли функция, которая не считывает строку а вырезает ее из файла(нужно сделать стек с помощью файла). И если мы вырезали строку, то размер файла автоматически уменьшается на вырезанную строку или все заполняется пробелами?

Спустя 2 часа, 1 минута, 44 секунды (18.03.2009 - 20:18) aromanu написал(а):
Профи, вы где? rolleyes.gif

Спустя 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 все есть строка?

Спустя 18 минут, 15 секунд (18.03.2009 - 21:59) sergeiss написал(а):
Цитата (aromanu @ 18.03.2009 - 20:42)
У меня лаба "сортировка элементов в файле методом Бэтчера"
Нужно что действия происходили в файле.
Вчера принес преподу версию с буфером в виде массива.
Цитирую препода: Молодой человек, так не катит, хочу что бы все было на месте в файле, и никаких буферов, никаких массивов.

У меня есть смутное подозрение, что препод "не совсем" представляет, что такое файл, буфер, массив...
Потому что такого дебилизма мне еще не приходилось слышать еще smile.gif Ну как можно отсортировать данные, не закачав их в оперативку? А если их закачал, то уж как минимум какой-то буфер будет использоваться. А массивы как раз придуманы для того, чтобы обрабатывать большие объемы однотипных данных.

Второй вариант - студент не понял совершенно, что сказал преподаватель smile.gif И тогда получается, что уже он "не совсем" представляет, что такое файл, буфер, массив...

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

Спустя 2 минуты, 12 секунд (18.03.2009 - 22:18) Kuliev написал(а):
aromanu
Что то я не совсем понял, что тебе нужно!

Хотя как я понимаю тебе надо отсортировать цифры в файле по убыванию или по возрастанию ???

Спустя 2 минуты, 25 секунд (18.03.2009 - 22:20) sergeiss написал(а):
Цитата (aromanu @ 18.03.2009 - 22:15)
Еще раз объясню для тугих wink.gif

Ну ежели ты такой "умный"... То сам и делай. Чего нас, дебилов тугоумных, спрашивать?
Но когда до тебя и до препода дойдет, что "работа в файле" - это всё равно использование буферов, и постоянное перезаписывание данных на диске будет просто фатально тормозить работу... То, может, тебе кто из "тугих" и подскажет, как это исправить.

ОК, "умник"? tongue.gif

Спустя 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)
Файл не маленький.

а миллион чисел? А какая будет производительность данного алгоритма? А какая производительность алгоритма с массивами? И это не "дебилизм"?

Но не ссуть.. Есть задача, нужно решение. Щас придумаем че-нить. smile.gif

ЗЫ. ребят, не ругайтесь smile.gif Тут препод виноват, а не студент smile.gif

Спустя 4 минуты, 52 секунды (18.03.2009 - 22:31) aromanu написал(а):
sergeiss, давайте не будем обижаться без повода для обид. прошу прошения, если плохо слежу за своей речью. Я понимаю что что файл и есть буфер. Выше я же писал, что ни каких буферов в виде массивов Я понимаю что это фатально тормозит работу и все такое.

Спустя 4 минуты, 42 секунды (18.03.2009 - 22:36) sergeiss написал(а):
Я не обижаюсь... Но посылать куда-то далеко людей, которые отвечают на тобой же заданные вопросы - это норма жизни?

А вообще, ежели тебе не нужен массив, то используй "переменные переменные". Хотя, по сути, получишь всё равно то же самое, что и массив smile.gif Только с ненужным гемором. И с очень большим.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.