[PHP] считать строку из файла

uncle17

Требуется взять строку с номером таким-то...

<?php
$handle = fopen ("database.sql", "r");
$i=0;
while ($i<650587) {
$buffer = fgets($handle, 4096);
$i++;
}
echo $buffer;
fclose ($handle);
?>

при разных значениях "4096" дает разные результаты. Куда смотреть?

artimon

www.php.net/fgets
Видимо, у тебя просто строки длиннее 4096 байт.
А не проще взять Unix utils?

uncle17

про длинные строки я тоже думал... Но вряд ли в этой базе были блобы по полмега.
За сцылку спасибо, сейчас будем посмотреть

artimon

4096 это не полмега.

uncle17

я ж говорил, что разные значения пробовал...

alexkravchuk


при разных значениях "4096" дает разные результаты. Куда смотреть?
Причина, как уже сказали, в избыточной длине строки. Можно вообще убрать этот 4096.
Как грубый вариант - модифицировать как

$buffer = fgets($handle,4096);
if($buffer[strlen($buffer)-1]=="\n")
$i++;

главное, чтобы нужная строка длиннее не оказалась...

otets-mihail

тогда уж fread

stm7884696

А ты уверен, что там все записи каждая на отдельной строке хранится?

uncle17

если его убрать, по умолчанию он равен 1024. Этого явно мало.

uncle17

э-э-э... ну вроде как дампы mysql так и делаются

Marinavo_0507

> при разных значениях "4096" дает разные результаты
в военное время значение косинуса может достигать 3?

uncle17

а то и больше:)

alexkravchuk

я думаю, fread будет ощутимо тормознее...

sergey_m

> при разных значениях "4096" дает разные результаты. Куда смотреть?
Если бы ты вместо того, чтобы тупо копировать примеры, прочитал что такое fgets в php и что означают его аргументы, то не удивлялся бы тому, что происходит.

Marinavo_0507

> ну вроде как дампы mysql так и делаются
не всегда, есть опция -e

stm7884696

и в чем там фишка?

RED-GREEN

интернета нет?

uncle17

с ней, я так понимаю, всё в одну строку пишется? Не, судя по просмотру, на разных

Marinavo_0507

вот ты упёртый
ты понимаешь неправильно

uncle17

строка fgets ( ресурс дескриптор [, целое длина])
Возвращает строку размером в указанную длину - 1 байт, прочитанную из файла, на который указывает параметр дескриптор. Чтение из файла заканчивается, когда количество прочитанных байтов достигает длины - 1 или по достижении конца файла. Если длина не указывается, по умолчанию ее значение равно 1 килобайту или 1024 байтам.
В случае возникновения ошибки функция возвращает FALSE.
вот не вижу я тут, с какого он должен заканчивать работу по достижении конца СТРОКИ и переходить на следующую... я сам уже давно понять не могу, почему этот пример работает:)

stm7884696

есть, головы нет... что бы переводить...

uncle17

жаль... хотя это, конечно, не мое дело, а админов, но самому тоже приходится участвовать... и всё из-за того, что кто-то два года назад поленился лишний винт поставить....

alexkravchuk

вот не вижу я тут, с какого он должен заканчивать работу по достижении конца СТРОКИ и переходить на следующую... я сам уже давно понять не могу, почему этот пример работает:)
Для устойчивости, чтобы с виду правильный код не падал от нехватки памяти. Поставь 1000000000, всё равно предельная память раньше кончится - хотя это, конечно, неправильный подход в общем случае.

uncle17

именно так только что и сделал:) поставил мегабайт - пусть старается...

erotic

гмгмгм
вот тут пишут:
string fgets ( resource handle [, int length] )
Возвращает строку размером в length - 1 байт, прочитанную из дескриптора файла, на который указывает параметр handle . Чтение заканчивается, когда количество прочитанных байтов достигает length - 1, по достижении конца строки (который включается в возвращаемое значение) или по достижении конца файла (что бы ни встретилось первым). Если длина не указана, по умолчанию ее значение равно 1 килобайту или 1024 байтам.
чаго непонятно-то?
Оставить комментарий
Имя или ник:
Комментарий: